如何在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的代码迁移选项的更多信息。