#navi_header|Java| Mavenでtools.jarを参照するときに、主に環境面でトラブルに遭遇することがあります。 そこで主なトラブルと対処法についてまとめてみました。 * そもそもtools.jarを参照する方法が分からない ""で""に"system"を設定します。これはローカル上のjarファイルをコンパイル時に参照させたい(でもパッケージング時には含めない)場合に使います。""によりローカル上のtools.jarを指定します。 pom.xmlの""の例(Windows or unix): #pre||> com.sun tools 1.5 system ${java.home}/../lib/tools.jar ||< * MacOSXの場合はtools.jarがclasses.jarに含まれているので不要になるが、マルチOSに柔軟に対応させるには? MacOSXの場合はtools.jarがclasses.jarに含まれているので不要のようです。 このようにOS毎に設定を切り替えるにはMavenの"profile"という機能を使います。 以下に2種類のバリエーションを紹介します。 - Windowsならtools.jar, Macならclasses.jarで切り替えるタイプ -- → java - JDK tools.jar as maven dependency - Stack Overflow --- http://stackoverflow.com/questions/3080437/jdk-tools-jar-as-maven-dependency #pre||> windows_profile Windows ${java.home}/../lib/tools.jar osx_profile mac ${java.home}/../Classes/classes.jar ||< - Macの場合はclasses.jarをデフォルトで参照してるので必要ない、unixとwindowsのみtools.jarを参照させる。 -- [maven2]tools.jarについて - hello,world -- http://www.sorich.jp/blog/shimamura/2009/04/maven2toolsjar.html #pre||> excluding_mac !mac com.sun tools 1.5.0 system ${java.home}/../lib/tools.jar ||< 他、参照: - Maven Enforcer Plugin - Require OS Version -- http://maven.apache.org/plugins/maven-enforcer-plugin/rules/requireOS.html - Maven - Introduction to build profiles -- http://maven.apache.org/guides/introduction/introduction-to-profiles.html - java - Missing artifact com.sun:tools:jar - Stack Overflow -- http://stackoverflow.com/questions/8375423/missing-artifact-com-suntoolsjar - java - maven: How to load tools.jar/classes.jar in an OS independent way? - Stack Overflow -- http://stackoverflow.com/questions/6219533/maven-how-to-load-tools-jar-classes-jar-in-an-os-independent-way * tools.jarへの依存関係が解決できない。゚(゚´Д`゚)゚。 mvn単体で発生する場合と、mvnでは問題ないのにEclipse + m2eプラグインだと発生してしまう場合があります。 結論から言うと、''mvn または Eclipse のランタイム環境がJDKであることを確認してください。'' 前述のとおり""に ${java.home} からの相対パスを指定している場合は特にこれでトラブルになる可能性が高いと思われます。 ** mvnのランタイム環境を確認:"mvn -version"で確認 #pre||> > 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のバージョンや""の指定を確認し、最終的に参照されるtools.jarの存在を確認してください。 ** Eclipseのランタイム環境を確認 まずEclipse + m2e環境でtools.jarへの参照を解決できない場合、問題やエラーログに詳細が表示されますので確認してください。 自分の場合、以下の様なログが出ていました。 #pre||> 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になってなかったことが原因でした) - java home - weird problem with JAVA_HOME and maven dependencies - Stack Overflow -- http://stackoverflow.com/questions/5359520/weird-problem-with-java-home-and-maven-dependencies - maven - Eclipse Indigo M2E Ignores MAVEN_OPTS in external installation - Stack Overflow -- http://stackoverflow.com/questions/9706089/eclipse-indigo-m2e-ignores-maven-opts-in-external-installation - [m2e-users] System dependencies unresolved -- http://dev.eclipse.org/mhonarc/lists/m2e-users/msg02028.html - [#MPLUGIN-202] Dependency on tools.jar should be expressed with profiles - jira.codehaus.org -- http://jira.codehaus.org/browse/MPLUGIN-202 - Bug 338072 ? ${env.VARIABLE} is not getting expanded -- https://bugs.eclipse.org/bugs/show_bug.cgi?id=338072 - m2eclipse Issues Mailing List - [m2e issues] [JIRA] Commented: (MNGECLIPSE-581) [mng] Fail to resolve dependencies if the system path contains envirnoment variable -- http://m2eclipse-issues-mailing-list.2838316.n2.nabble.com/m2e-issues-JIRA-Commented-MNGECLIPSE-581-mng-Fail-to-resolve-dependencies-if-the-system-path-containe-td6057920.html - [#MNGECLIPSE-581] [mng] Fail to resolve dependencies if the system path contains envirnoment variable - Sonatype JIRA -- https://issues.sonatype.org/browse/MNGECLIPSE-581 #navi_footer|Java|