https://bugs.eclipse.org/bugs/show_bug.cgi?id=274969
の件。
既存のJRECotainerのパスを維持するように修正しみた。めちゃ簡単だった。そして、パッチつくってみた。
JDTユーザ(開発者)がすでにJREContainerのパスを指定してれば維持するが、なければ既存の処理 getJREClasspathContainerメソッドが呼び出されるようなる。
とりあえず、回避策としてはいいのではないかなーと思いますが、いかがでしょうか。本家のほうに打診してみようかな。英語を書くのが大変なんすけど。がんばってみようかと。
Index: src/main/java/org/eclipse/iam/jdt/core/handlers/MavenCompilerPluginHandler.java =================================================================== --- src/main/java/org/eclipse/iam/jdt/core/handlers/MavenCompilerPluginHandler.java (revision 20961) +++ src/main/java/org/eclipse/iam/jdt/core/handlers/MavenCompilerPluginHandler.java (working copy) @@ -259,22 +259,25 @@ List<IClasspathEntry> classpathEntriesList = SetUniqueList.decorate( new LinkedList<IClasspathEntry>() ); IProject project = javaProject.getProject(); /* keep any containers that already exist, except the JRE container, we'll add our new one */ try { + IClasspathEntry jreClasspath = null; IClasspathEntry[] oldClasspath = javaProject.getRawClasspath(); for ( IClasspathEntry classpathEntry : oldClasspath ) { if ( ( classpathEntry.getEntryKind() == IClasspathEntry.CPE_CONTAINER ) && ( classpathEntry.getPath().toString().indexOf( JRE_CONTAINER ) != -1 ) ) { + jreClasspath = classpathEntry; continue; } - classpathEntriesList.add( classpathEntry ); + classpathEntriesList.add( classpathEntry ); } - classpathEntriesList.add( getJREClasspathContainer() ); + //classpathEntriesList.add( getJREClasspathContainer() ); + classpathEntriesList.add(jreClasspath != null ? jreClasspath : getJREClasspathContainer()); } catch ( JavaModelException e ) {
読みにくい。。。以下のようなメソッドになります。MavenCompilerPluginHandler#buildRawClasspathメソッドはビルドごとに呼ばれるようです。
private void buildRawClasspath() { List<IClasspathEntry> classpathEntriesList = SetUniqueList.decorate( new LinkedList<IClasspathEntry>() ); IProject project = javaProject.getProject(); /* keep any containers that already exist, except the JRE container, we'll add our new one */ try { // 追加 IClasspathEntry jreClasspath = null; IClasspathEntry[] oldClasspath = javaProject.getRawClasspath(); for ( IClasspathEntry classpathEntry : oldClasspath ) { if ( ( classpathEntry.getEntryKind() == IClasspathEntry.CPE_CONTAINER ) && ( classpathEntry.getPath().toString().indexOf( JRE_CONTAINER ) != -1 ) ) { // 追加 jreClasspath = classpathEntry; continue; } classpathEntriesList.add( classpathEntry ); } // 変更 //classpathEntriesList.add( getJREClasspathContainer() ); classpathEntriesList.add(jreClasspath != null ? jreClasspath : getJREClasspathContainer()); } catch ( JavaModelException e ) { MavenJdtCoreActivator.getLogger().log( "Exception getting classpath from project " + project, e ); MavenCoreActivator.getDefault().getMavenExceptionHandler().handle( project, e ); } /* set the classpath */ IClasspathEntry[] classpathEntries = classpathEntriesList.toArray( new IClasspathEntry[classpathEntriesList.size()] ); try { javaProject.setRawClasspath( classpathEntries, null ); } catch ( JavaModelException e ) { MavenJdtCoreActivator.getLogger().log( "Exception adding classpath to project " + project, e ); MavenCoreActivator.getDefault().getMavenExceptionHandler().handle( project, e ); } }
とりあえず、Exportしてみたので、本件でお困りの方は自己責任で使ってみてください。
org.eclipse.iam.jdt.core_0.10.0.200909040836.jar
追記:
このプラグインだけ差し替えてもだめみたい。依存関係のプラグイン全部ビルドしないとだめかなー。ちょっと調べます。
追記:
プラグインのファイル名が間違っていた模様。こちらで。
org.eclipse.iam.jdt.core_0.10.0.20090627114955616.jar
org.eclipse.iam.jdt.core.patch