読者です 読者をやめる 読者になる 読者になる

lg3d-core.jar を CLASSPATH に追加する

プロジェクトはできました。でも、これだけじゃ LG3D のアプリケーションをコンパイルできません。

昨日の最後の図を見てもらえば分かると思うのですが、そう、lg3d-core.jar が CLASSPATH にないのです。

というわけで、追加しましょう。

JavaCapabilityConfigurationPage#init メソッドの第 3 引数で CLASSPATH が指定できそうなので、次のように記述してみました。

        javaPage = new JavaCapabilityConfigurationPage(){
            public void setVisible(boolean visible) {
                if (visible) {
                    project = creationPage.getProjectHandle();
                    IJavaProject javaProject= JavaCore.create(project);
                    
                    IPreferenceStore store = WrpePlugin.getDefault().getPreferenceStore();
                    String home = store.getString(WrpePlugin.LG3D_RREF_HOME_KEY);
                    Path corePath = new Path(home + CORE_LIBRARY);
                    IClasspathEntry[] entries = new IClasspathEntry[1];
                    entries[0] = JavaCore.newLibraryEntry(corePath, null, null);
                    
                    init(javaProject, null, entries, true);
                } else {
                }
                super.setVisible(visible);
            }
        };

実行すると...

CLASSPATH

ありゃ、今度は JRE System Library がなくなってしまいました。

JavaCapabilityConfigurationPage#init の Javadoc を見ると... あっ、間違い発見 ^^;; 引数の defaultOutputLocation と defaultEntries の説明が逆になってます。で、逆になっている説明を読むと、ここで設定できるのはデフォルトのクラスパスだけのようです。

それじゃぁ、デフォルトの CLASSPATH もいっしょに entries に入れてあげればいいのかもしれません。IJavaProject インタフェースには getResolvedClasspath メソッドというのがあって、CLASSPATH を取得できるようです。

そこで、次のように書きかえてみました。

        javaPage = new JavaCapabilityConfigurationPage(){
            public void setVisible(boolean visible) {
                if (visible) {
                    project = creationPage.getProjectHandle();
                    IJavaProject javaProject= JavaCore.create(project);
                    
                    IClasspathEntry[] defaultEntries = new IClasspathEntry[0];
                    try {
                        defaultEntries = javaProject.getResolvedClasspath(false);
                    } catch (JavaModelException e) {
                        e.printStackTrace();
                    }
                    IPreferenceStore store = WrpePlugin.getDefault().getPreferenceStore();
                    String home = store.getString(WrpePlugin.LG3D_RREF_HOME_KEY);
                    Path corePath = new Path(home + CORE_LIBRARY);
                    
                    IClasspathEntry[] entries = new IClasspathEntry[defaultEntries.length + 1];
                    System.arraycopy(defaultEntries, 0, entries, 0, defaultEntries.length);
                    entries[defaultEntries.length] = JavaCore.newLibraryEntry(corePath, null, null);
                    
                    init(javaProject, null, entries, true);
                } else {
                }
                super.setVisible(visible);
            }
        };

ところが、これで実行すると...

Java Model Exception: Java Model Status [sample does not exist]
	at org.eclipse.jdt.internal.core.JavaElement.newNotPresentException(JavaElement.java:468)
	at org.eclipse.jdt.internal.core.JavaModelManager.getPerProjectInfoCheckExistence(JavaModelManager.java:1223)
	at org.eclipse.jdt.internal.core.JavaProject.getPerProjectInfo(JavaProject.java:1785)
	at org.eclipse.jdt.internal.core.JavaProject.getRawClasspath(JavaProject.java:1842)
	at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1948)
	at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1888)
	at jp.gr.java_conf.skrb.lg3d.wrpe.wizard.LG3DProjectWizard$2.setVisible(LG3DProjectWizard.java:93)
  以下延々と続く...

そういえば、まだプロジェクトをクリエイトしていないので、こうなるのは当然ですね ^^;;