この手法 を使用するプロジェクトがあります。これはJDK8以前で正常に機能します。ただし、JDK 9では、このjarが削除され、機能しなくなりました。
com.Sun:tools:jarの「dependencies.dependency.systemPath」は、存在しないファイル/usr/lib/jvm/Java-9-jdk/../lib/tools.jarを参照します。 JREだけでなくJDKを使用してMavenを実行していることを確認してください。
(notools.jar JDK 9 がありますが、パスは奇妙に見えます
JDKバージョン間、そしておそらくJDKベンダー間でさえも機能するベストプラクティスは何ですか? OpenJDKでのJDK9の回避策も見つかりませんでした(プロジェクトをJDK 8でビルド可能にしたまま)。
あなたの問題は Project Jigsaw あなたが使ったと思われるJava 9EAビルドに加えられた変更によって引き起こされます。 JEP 22 それらについて説明します。
セクション削除:_rt.jar
_および_tools.jar
_はこれをより詳細に説明していますが、リスクと仮定には、適切な要約が含まれています。
JDKおよびJREイメージには、上記のように、ファイル_
lib/rt.jar
_、_lib/tools.jar
_、_lib/dt.jar
_、およびその他の内部jarファイルが含まれなくなります。これらのファイルの存在を前提とする既存のコードは、正しく機能しない可能性があります。
ご覧のとおり、これらのファイルはなくなっています。さらに下:
以前は_
lib/tools.jar
_で見つかり、そのファイルがクラスパスに追加されたときにのみ表示されるクラスおよびリソースファイルは、JDKイメージで、システムクラスローダーまたは場合によってはbootstrapクラスローダー。ただし、これらのファイルを含むモジュールは、アプリケーションクラスパス、つまり、システムプロパティ_Java.class.path
_の値には記載されません。
したがって、_tools.jar
_のクラスはモジュールに移動されますが、ユーザーが使用できない可能性があるようです。最近のジグソービルドから jdeps を使用する必要があります...
$jdeps -M -s $your_JAR
_jdeps -jdkinternals $your_JAR
_運が良ければ、使用しているAPIが公開されているか(2番目の分析では表示されません)、公開されている代替手段があります(2番目の分析でリストされます)。それ以外の場合は、これを Jigsawメーリングリスト に持っていくことを検討し、そこで助けを求め、使用しているAPIとその目的を明示的に書き留めてください。
JDK 9対応のソリューションは、 元のトリック とそれほど変わらないことがわかりました。
<profiles>
<profile>
<id>jigsaw</id>
<activation>
<jdk>[1.9,)</jdk>
</activation>
<!-- No dependencies needed by Jigsaw -->
<dependencies/>
</profile>
<profile>
<id>default-jdk</id>
<activation>
<file>
<exists>${Java.home}/../lib/tools.jar</exists>
</file>
</activation>
<dependencies>
<dependency>
<groupId>com.Sun</groupId>
<artifactId>tools</artifactId>
<scope>system</scope>
<version>1.6</version>
<systemPath>${Java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</profile>
<profile>
<id>osx-jdk</id>
<activation>
<file>
<exists>${Java.home}/../Classes/classes.jar</exists>
</file>
</activation>
<dependencies>
<dependency>
<groupId>com.Sun</groupId>
<artifactId>tools</artifactId>
<scope>system</scope>
<version>1.6</version>
<systemPath>${Java.home}/../Classes/classes.jar</systemPath>
</dependency>
</dependencies>
</profile>
</profiles>
dependency
宣言全体をprofile
に移動すると、さまざまなプロファイルでさまざまな数の依存関係を使用できるようになります。
私は 再利用可能なモジュール を作成して、tools.jarに依存する個々のプロジェクトから複雑さを隠しました。
<dependency>
<groupId>com.github.olivergondza</groupId>
<artifactId>maven-jdk-tools-wrapper</artifactId>
<version>0.1</version>
</dependency>
あなたの解決策(単なる回避策)は壊れていると見なされ、notで動作しますJava 9。あなたができることはjdeps
を実行してあなたのパブリックAPIへのコード。