如何在Java eefunction上expression对Java 9过渡的依赖关系?

我们使用maven并有文物,反过来依赖于其他内部文物。 我正在迁移到java-9的过程中,并打算先将所有内容迁移到Java 9,而不是模块化代码(即在未命名的模块中)。

我碰到的问题是,我们依赖于java.xml.bind ,它现在不包含在默认模块中。 有没有一种“正确”的方式来expression这个对Maven的java.xml.bind依赖?

模块系统讲述了在您从classpath加载应用程序的情况下未命名模块构造模块图的方式。 此外,从文档本身:

当编译器编译未命名模块中的代码,或调用java启动程序,并将应用程序的主类从类path加载到应用程序类加载程序的未命名模块时,那么未命名模块的默认根模块集计算如下:

  • 如果存在, java.se模块是一个根。 如果不存在,那么升级模块path上的每个java.*模块或exports至less一个软件包的系统模块(无限制)都是根。

  • 升级模块path上或exports至less一个软件包的系统模块中的每个non-java.*模块(无限制)也是一个根。

否则,根模块的默认设置取决于阶段:

  • 在编译时,通常是编译的模块集合(下面更多的)。

  • 在链接时它是空的; 和

  • 在运行时,它是应用程序的主模块,通过--module (或简称为-m)启动选项指定。

偶尔需要将模块添加到默认根集,以确保特定的平台,库或服务提供商模块将出现在模块图中。 在任何阶段的选项

--add-modules <module>(,<module>)*其中<module>是模块名称,将命名模块添加到默认的根模块集。

在jetty.project中也遇到了类似的问题,jdk邮件列表中的一个线程讨论了相同的问题,修复方法是使用:

 --add-modules java.se.ee 

这为他们提供了对所有Java SE模块的访问权限,在你的情况下只需要:

 --add-modules java.xml.bind 

要在maven中使用这个,你可以使用maven-compiler-plugin

 <compilerArgs> <arg>--add-modules</arg> <arg>java.xml.bind</arg> </compilerArgs> 

正如ZhekaKozlov 在这里所build议的那样。


需要注意的重要一点是,标记API的弃用也意味着您可能想要放弃使用它。 为了适应这种方式,你可能会开始消耗对jaxb-api:2.3.0的依赖,现在可以作为一个模块加载,也可以从类path中执行。 您需要做的更改是将以下内容添加到您的依赖关系列表中:

 <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> 

是的,您必须将--add-modules传递给Java编译器:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <release>9</release> <compilerArgs> <arg>--add-modules</arg> <arg>javax.xml.bind</arg> </compilerArgs> </configuration> </plugin> 

那么你的项目应该编译好。

JAXB以及与Java EE共享的其他API(JAX-WS,JAF,JTA和所谓的“通用注释”)在Java SE 9中已弃用,并且build议在将来的Java SE版本中删除, JDK。 每个API都有一个独立的版本/下载。 每个API都有自己的JSR来维护它。 从包含在JDK中的API过渡到独立版本当然会有一些破坏性。

从Java SE和JDK中删除这些API的第一步是默认情况下不parsing包含这些API的模块。 当您使用JDK 9编译或运行类path上的代码时,最初将显示API不存在。 正如另一个答案所指出的,一个快速的解决方法是使用--add-modules java.xml.bind进行编译或运行。 该CLI选项将“java.xml.bind”模块添加到一组根模块以在启动时parsing,并且它与JDK 9一起工作,因为该模块包含在JDK运行库映像中。

除了快速的解决方法之外,使用JAXB的应用程序或库将需要转向使用独立版本的API /实现。 JAXB 2.3.0将很快发布到Maven Central,它包含了与JDK 9及更高版本一起工作的更改。 独立版本可以像其他JAR文件一样部署在类path中。 最终可以在(升级)模块path上部署独立版本,并将其作为模块使用。 “JDK 9迁移指南”将提供有关使用JAXB或与Java EE共享的其他API的代码迁移选项的更多信息。