[英]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.jar
、lib/tools.jar
、lib/dt.jar
和其他內部 jar 文件。 假定存在這些文件的現有代碼可能無法正常工作。
所以正如你所觀察到的,那些文件已經消失了。 再向下:
以前在
lib/tools.jar
找到並且僅當該文件添加到類路徑時才可見的類和資源文件現在在 JDK 映像中將通過系統類加載器或在某些情況下引導類加載器可見。 然而,包含這些文件的模塊不會在應用程序類路徑中被提及,即,在系統屬性java.class.path
的值中。
因此, tools.jar
中的類被移動到模塊中,但用戶似乎無法使用它們。 您應該使用最近的 Jigsaw 構建中的jdeps ...
$jdeps -M -s $your_JAR
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.