2008/12/17

AJDTやAspectJをベースにしたツールの開発

Developer's guide to building tools on top of AJDT and AspectJ
AJDTやAspectJをベースにしたツールの開発ガイド。

EclipseプラグインからAJDTを利用する方法や、AspectJのパーザ(.ajファイルパーザ)を利用する方法が解説されてる。

Java6 on MacOS X では Eclipse は動作しない

どうせならEclipseもJava6上で動かしてやろうと、Info.plistを編集してJava6を指定し、起動するとエラーが出た。

調べてみると、MacのJava6自体は64bitで実装されているが、SWTが32bitにしか対応していないためらしい。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=239301によると、現在SWTをCarbonからCocoaに移植してる(CocoaSWT)最中で、それが終わってから、Eclipse3.5くらいで64bit対応できるといいなぁって程度らしい。

ちなみにCocoaSWTの移植が終わるのはSWT3.5のM6、March 13, 2009。
64bit版はいつになることやら。

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がわざわざそうするとも思えないので、根本的な解決が計られることは無いような気がする。困ったもんだ。