https://bugs.eclipse.org/bugs/show_bug.cgi?id=274969
つたない英語で伝わるかどうか微妙ですが、回避方法の提案をポストしてみた。どんな反応がでるか楽しみですが。。。
追記:
返事きたー。って空気読まずにポストしたのですが、やっぱり要求仕様をわかってなかったなーw。まぁ、いいか。提案を考えてみよう。
ExecutionEnvironmentがInstallされているVMに勝手に切り替わる件
の続報ですが、
私もEclipseプラグインの初心者でしたが、プラグインプロジェクトを構成して、デバッグまでできるようになりました。ははは。
MavenCompilerPluginHandlerで、
maven-compiler-pluginで指定されているVMのバージョンにマッチするInstallされているVMに切り替えている模様。
MavenCompilerPluginHandler#getJREContainersMapメソッドでJavaRuntime#newJREContainerPath(IVMInstall vm) というメソッドでMapを作っているので、これはバグというか仕様かもしれません。newJREContainerPath(IExecutionEnvironment environment)は使われてないようです。
private Map<String, IClasspathEntry> getJREContainersMap() { Map<String, IClasspathEntry> jreContainers = new HashMap<String, IClasspathEntry>(); jreContainers.put( getJREVersion( JavaRuntime.getDefaultVMInstall() ), JavaRuntime.getDefaultJREContainerEntry() ); for ( IVMInstallType installType : JavaRuntime.getVMInstallTypes() ) { for ( IVMInstall install : installType.getVMInstalls() ) { String version = getJREVersion( install ); if ( !jreContainers.containsKey( version ) ) { jreContainers.put( version, JavaCore.newContainerEntry( JavaRuntime.newJREContainerPath( install ) ) ); } } } return jreContainers; }
そもそも、JREContainerPathを組み立て直さないといけない理由がわからないのですが、現状のJREContainerPathを維持するような処理にできないかなーと。時間があったら考えてみよう。
ExecutionEnvironmentがInstallされているVMに勝手に切り替わる件(回避方法つくった)
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