Mavenでtools.jarを参照するときに、主に環境面でトラブルに遭遇することがあります。
そこで主なトラブルと対処法についてまとめてみました。
"<dependency>"で"<scope>"に"system"を設定します。これはローカル上のjarファイルをコンパイル時に参照させたい(でもパッケージング時には含めない)場合に使います。"<systemPath>"によりローカル上のtools.jarを指定します。
pom.xmlの"<dependency>"の例(Windows or unix):
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.5</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
MacOSXの場合はtools.jarがclasses.jarに含まれているので不要のようです。
このようにOS毎に設定を切り替えるにはMavenの"profile"という機能を使います。
以下に2種類のバリエーションを紹介します。
<profiles>
<profile>
<id>windows_profile</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<properties>
<toolsjar>${java.home}/../lib/tools.jar</toolsjar>
</properties>
</profile>
<profile>
<id>osx_profile</id>
<activation>
<os>
<family>mac</family>
</os>
</activation>
<properties>
<toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
</properties>
</profile>
</profiles>
<profile>
<id>excluding_mac</id>
<activation>
<os>
<family>!mac</family>
</os>
</activation>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</profile>
他、参照:
mvn単体で発生する場合と、mvnでは問題ないのにEclipse + m2eプラグインだと発生してしまう場合があります。
結論から言うと、mvn または Eclipse のランタイム環境がJDKであることを確認してください。
前述のとおり"<systemPath>"に ${java.home} からの相対パスを指定している場合は特にこれでトラブルになる可能性が高いと思われます。
> mvn -version Apache Maven 3.0.4 (r1232337; 2012-01-17 17:44:56+0900) Maven home: C:\in_vitro\apps\apache-maven-3.0.4\bin\.. Java version: 1.6.0_22, vendor: Sun Microsystems Inc. Java home: C:\Program Files\Java\jdk1.6.0_22\jre Default locale: ja_JP, platform encoding: MS932 OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"
なおその上で、pom.xmlでjvmのバージョンや"<systemPath>"の指定を確認し、最終的に参照されるtools.jarの存在を確認してください。
まずEclipse + m2e環境でtools.jarへの参照を解決できない場合、問題やエラーログに詳細が表示されますので確認してください。
自分の場合、以下の様なログが出ていました。
Missing artifact com.sun:tools:jar:1.5.0 pom.xml コンテナー 'Maven 依存関係' が存在しないライブラリー 'C:\Users\xxxxxx\.m2\repository\com\sun\tools\1.5.0\tools-1.5.0.jar' を参照しています ビルド・パスのエラーが解決されるまで、プロジェクトをビルドできません
→ "${java.home}"でなく、"$HOME/.m2/repository"を参照している時点で明らかにJavaのランタイム環境がおかしくなっています。
EclipseのランタイムJava環境は「ヘルプ」→「Eclipseについて」→「インストール詳細」→「構成」タブから"-vm"行を確認します。これがJDKになっていない場合は、eclipse.ini(Winならeclipse.exeと同じフォルダにある)に"-vm"オプションを追加します。なお"-vm"オプションは"-vmargs"の前に設定することを忘れずに。"-vmargs"以下はJVMへの引数として解釈されてしまいます。
例:
... -vm C:/Program Files/Java/jdk1.6.0_xx/bin/javaw.exe -vmargs ...
参考:(最初m2eのバグの可能性も考えて色々調べたのですが、結局ランタイムがJDKになってなかったことが原因でした)