2008/12/13

LeopardのJava6でJavaFX1.0をスクリプティングAPI(JSR223)経由で実行する

JavaFX1.0がリリースされたので、早速Macで動かしてみた。JavaFXとして起動するともちろん動くんだけど、Javaからスクリプトとして実行すると、うまくいかない。

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: com.sun.tools.javac.main.RecognizedOptions.getJavacFileManagerOptions(Lcom/sun/tools/javac/main/RecognizedOptions$OptionHelper;)[Lcom/sun/tools/javac/main/JavacOption$Option;
at com.sun.tools.javac.util.JavacFileManager.(JavacFileManager.java:973)
at com.sun.tools.javafx.api.JavafxcTool.getStandardFileManager(JavafxcTool.java:102)
at com.sun.tools.javafx.script.JavaFXScriptCompiler.compile(JavaFXScriptCompiler.java:97)
at com.sun.tools.javafx.script.JavaFXScriptEngineImpl.parse(JavaFXScriptEngineImpl.java:206)
...

javac関連のクラスが競合していてエラーが出てる。調べてみると、事情は少々複雑なようだ(後述)。解決策としては、プログラムを実行するJava6に、javafxc.jarを優先的にロードさせればいい。

Eclipseで実行する場合、Installed JREsからJVMの実行環境を編集し、/System/Library/Frameworks/JavaFX.framework/Versions/1.0/lib/shared/javafxc.jarを追加して先頭に持ってくる。

コマンドラインからは試してないけど、おそらくbootclasspathオプションが使えるはず。


何故そんなことになるかだけど、これは2つの事情が関係している。

Mac側の事情は、Javaのclasses.jarに、Windowsで言うところのtools.jarの内容が含まれていること。何故こうなってるかはわからないんだけど、調べてみるとこれでが原因で、いろんなソフトウェアではまっている人が結構居るようだ(といってもtools.jar前提のソフト自体限られるけど)。

JavaFX側の事情は、スクリプトのコンパイラであるjavafxc.jarに、こちらもtools.jarの内容が含まれていること。これは、JavaFXがスクリプトからバイトコードを生成するものなので、理解はできる。但し、その内容がJava5相当のものになっている。Java6 update10とセットかの用に語られているけど、実はMacではJDK5 Update 13(Appleの表現だとLeopardでUpdate 2相当)以降で動作するようになっている(WindowsではJDK6 Update 7以降)ためのようだ(JavaFX 1.0 SDK Requirements参照)。

それぞれ事情があり、Mac側の事情はたいしたこと無さそうだけど(tools.jarに切り出すことは簡単なはず)Appleがわざわざそうするとも思えないので、根本的な解決が計られることは無いような気がする。困ったもんだ。

0 件のコメント: