声明对tools.jar的maven依赖以在JDK 9上工作

Oli*_*dža 13 maven tools.jar java-9

我有一个使用这种技术的项目在JDK 8及更早版本中运行良好.但是,在JDK 9中,这个jar被删除了,它不再起作用:

com.sun的"dependencies.dependency.systemPath":tools:jar指的是一个不存在的文件/usr/lib/jvm/java-9-jdk/../lib/tools.jar.请验证您使用JDK而不仅仅是JRE运行Maven.

(虽然JDK 9中没有 tools.jar ,但这条路看起来很奇怪)

什么是可以在JDK版本甚至JDK供应商中工作的最佳实践?我甚至没有在OpenJDK上找到JDK 9的任何解决方法(同时保持项目可在JDK 8上构建).

Nic*_*lai 15

您的问题是由您似乎使用过的Java 9 EA构建中的Project Jigsaw更改引起的.JEP 220描述了它们.

删除rt.jartools.jar部分:更详细地描述了这一点,但风险和假设包含一个很好的总结:

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
  • ...确定对JDK内部API的依赖: jdeps -jdkinternals $your_JAR

如果你很幸运,你正在使用的API已经发布(那么它将不会出现在第二次分析中)或者有一个公共替代(第二个分析会列出).否则你应该考虑把它带到Jigsaw邮件列表并在那里寻求帮助,明确指出你正在使用哪些API以及用于什么.


Oli*_*dža 6

事实证明,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>
Run Code Online (Sandbox Code Playgroud)

如果将整个dependency声明移动到profile它,则可以使不同的配置文件使用不同数量的依赖项.


我创建了一个可重用的模块来隐藏依赖于tools.jar的单个项目的复杂性:

<dependency>
  <groupId>com.github.olivergondza</groupId>
  <artifactId>maven-jdk-tools-wrapper</artifactId>
  <version>0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Mic*_*l-O 0

您的解决方案(仅是解决方法)被视为已损坏,并且无法Java 9 一起使用。您所能做的就是运行jdeps代码并将其移动到公共 API。