Объявите 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.

Другие вопросы по тегам