2008年11月11日火曜日

maven test with IBM JDK

maven testを起動はClassLoaderが違うため結構戸惑う事が多い。
しかも、仕事上ではIBMのJDKを利用しているのでSUNとの違いがある場合にも戸惑ってしまった。

mavenで単体テストを駆動するのはsurefireのプラグインを下記のように仕込みます。

<reporting>
<plugins>
<plugin>
<groupid>org.apache.maven.plugins<groupid>
<artifactid>maven-surefire-plugin<artifactid>
</plugin>
</plugins>
</reporting>
しかし現在のsurefireのバージョン2.4でClassLoaderの挙動を変更したらしく今まで動いていたテストがIBM JDKでは

java クラスが見つかりません: org/apache/maven/surefire/booter/SurefireBooter

といわれてしまいます。一度調査したところ、

<useSystemClassLoader>false<useSystemClassLoader>

を指定すれば解決する様子。

試してみると、今度は自作のテストライブラリで問題発生。
(具体的にはbetwixtを利用している部分でXXX.betwixtファイルが見つからなくなってしまった・・・)

しょうがないので
useSystemClassLoaderをtrueに戻し(デフォールト値のままなので削除)maven -X testのデバッグモードで探ってみるとテスト起動時のコマンドを探ります。

Forking command line: cmd.exe /X /C "C:\Progra~1\IBM\java\jre\bin\java -jar C:\DOCUME~1\myAccount\LOCALS~1\Temp\surefirebooter48643.jar C:\DOCUME~1\myAccount\LOCALS~1\Temp\surefire48641tmp C:\DOCUME~1\myAccount\LOCALS~1\Temp\surefire48642tmp"

起動しようとしている surefirebooter48643.jarの中身を確認するとMANIFEST.MFしか存在しません。
そのMANIFEST.MFで Class-Path,およびMain-Class を指定することでSurefireBooterを起動しようと
しているのですが、これがIBM JDKでは対応できていない?みたいなのです。

しょうがないのでmavenのサイト をよく確認すると
useManifestOnlyJarを改めて設定するとこの問題も解決するみたいです。

結果pom.xmlは下記のようになりました。

<reporting>
<plugins>
<plugin>
<groupid>org.apache.maven.plugins<groupid>
<artifactid>maven-surefire-plugin<artifactid>
<configuration>
<useManifestOnlyJar>false<useManifestOnlyJar>
</configuration>
</plugin>
</plugins>
</reporting>

ただし、useManifestOnlyJarの対応はsurefire2.4.3からのオプションなので

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins
<artifactId>maven-surefire-plugin
<version>2.4.3
</plugin>
</plugins>
</pluginManagement>
</build>

pluginManagementでバージョンも明示的に指定しておいたほうが無難です。