かとじゅんの技術日誌

技術の話をするところ

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 直