Объявите maven зависимость от tools.jar для работы на JDK 9
У меня есть проект, который использует эту технику, которая отлично работает в JDK 8 и старше. Однако в JDK 9 этот jar был удален, и он больше не работает:
'dependencies.dependency.systemPath' для com.sun:tools:jar ссылается на несуществующий файл /usr/lib/jvm/java-9-jdk/../lib/tools.jar. Пожалуйста, убедитесь, что вы используете Maven, используя JDK, а не только JRE.
(Путь выглядит странно, хотя в JDK 9 нет tools.jar)
Какова наилучшая практика, которая будет работать в версиях JDK и, возможно, даже вендоров JDK? Я даже не нашел никакого обходного пути для JDK 9 в OpenJDK (при этом поддерживая возможность сборки проекта на JDK 8).
3 ответа
Ваши проблемы вызваны изменениями Project Jigsaw, которые вошли в сборку Java 9 EA, которую вы, похоже, использовали. JEP 220 описывает их.
Раздел удален: rt.jar
а также tools.jar
описывает это более подробно, но Риски и Допущения содержит хорошее резюме:
Изображения JDK и JRE, как отмечалось выше, больше не будут содержать файлы
lib/rt.jar
,lib/tools.jar
,lib/dt.jar
и другие внутренние файлы JAR. Существующий код, предполагающий существование этих файлов, может работать неправильно.
Итак, как вы заметили, эти файлы исчезли. Дальше:
Файлы классов и ресурсов, ранее найденные в
lib/tools.jar
и видимый только тогда, когда этот файл был добавлен в путь к классу, теперь в образе JDK будет виден через загрузчик классов системы или, в некоторых случаях, загрузчик классов начальной загрузки. Модули, содержащие эти файлы, однако, не будут упоминаться в пути к классу приложения, т. Е. В значении системного свойства.java.class.path
,
Так что классы от tools.jar
перемещаются в модули, но кажется, что они могут быть недоступны для пользователя. Вы должны использовать jdeps из последней сборки Jigsaw...
- ... чтобы определить зависимости вашего модуля:
$jdeps -M -s $your_JAR
- ... чтобы определить зависимости от внутренних API JDK:
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.