web-dev-qa-db-ja.com

JDK9で動作するようにtools.jarへのMaven依存関係を宣言します

この手法 を使用するプロジェクトがあります。これは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でビルド可能にしたまま)。

13
Oliver Gondža

あなたの問題は 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_
  • ... JDK内部APIへの依存関係を判別するには:_jdeps -jdkinternals $your_JAR_

運が良ければ、使用しているAPIが公開されているか(2番目の分析では表示されません)、公開されている代替手段があります(2番目の分析でリストされます)。それ以外の場合は、これを Jigsawメーリングリスト に持っていくことを検討し、そこで助けを求め、使用しているAPIとその目的を明示的に書き留めてください。

15
Nicolai

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>
5
Oliver Gondža

あなたの解決策(単なる回避策)は壊れていると見なされ、notで動作しますJava 9。あなたができることはjdepsを実行してあなたのパブリックAPIへのコード。

0
Michael-O