簡體   English   中英

聲明 Maven 依賴於 tools.jar 以在 JDK 9 上工作

[英]Declare maven dependency on tools.jar to work on JDK 9

我有一個使用這種技術的項目, 該技術在 JDK 8 及更早版本中運行良好。 但是,在 JDK 9 中,這個 jar 被刪除了,它不再起作用:

com.sun:tools:jar 的“dependencies.dependency.systemPath”指的是一個不存在的文件 /usr/lib/jvm/java-9-jdk/../lib/tools.jar。 請驗證您是否使用 JDK 而不僅僅是 JRE 運行 Maven。

(路徑看起來很奇怪,雖然JDK 9 中沒有tools.jar )

適用於 JDK 版本甚至 JDK 供應商的最佳實踐是什么? 我什至沒有在 OpenJDK 上找到 JDK 9 的任何解決方法(同時保持項目可在 JDK 8 上構建)。

您的問題是由您似乎使用過的 Java 9 EA 構建中的Project Jigsaw更改引起的。 JEP 220描述了它們。

Removed: rt.jar and tools.jar部分更詳細地描述了這一點,但Risks and Assumptions包含一個很好的總結:

如上所述,JDK 和 JRE 映像將不再包含文件lib/rt.jarlib/tools.jarlib/dt.jar和其他內部 jar 文件。 假定存在這些文件的現有代碼可能無法正常工作。

所以正如你所觀察到的,那些文件已經消失了。 再向下:

以前在lib/tools.jar找到並且僅當該文件添加到類路徑時才可見的類和資源文件現在在 JDK 映像中將通過系統類加載器或在某些情況下引導類加載器可見。 然而,包含這些文件的模塊不會在應用程序類路徑中被提及,,在系統屬性java.class.path的值中。

因此, tools.jar中的類被移動到模塊中,但用戶似乎無法使用它們。 您應該使用最近的 Jigsaw 構建中的jdeps ...

  • ...確定您的模塊依賴項: $jdeps -M -s $your_JAR
  • ... 確定對 JDK 內部 API 的依賴: jdeps -jdkinternals $your_JAR

如果幸運的話,您正在使用的 API 已發布(那么它不會出現在第二次分析中)或有一個公共替代品(第二次分析將列出)。 否則你應該考慮把它帶到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>

您的解決方案(僅是解決方法)被視為已損壞並且不適用於 Java 9。您所能做的就是運行jdeps並將您的代碼移動到公共 API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM