Kev*_*son 19 java jaxb maven java-platform-module-system java-9
我们使用maven并拥有依赖于其他内部工件的工件.我正在迁移到java-9,并且打算首先将所有内容迁移到Java 9而不模块化代码(即在未命名的模块中).
我遇到的问题是我们依赖java.xml.bind,现在不包含在默认模块中.是否有一种"正确"的方式来表达对java.xml.bindMaven的依赖?
Nam*_*man 21
该模块系统讲的无名模块作为在从类路径加载应用的情况下构建模块图的方式.此外,从文件本身: -
当编译器在未命名的模块中编译代码,或者调用java启动程序并且应用程序的主类从类路径加载到应用程序类加载器的未命名模块时,那么未命名模块的默认根模块集计算如下:
该
java.se模块是一个根,如果它存在.如果它不存在则java.*升级模块路径上或系统模块中的每个模块,exports至少一个包,没有限定,是根.
non-java.*升级模块路径上或系统模块中的每个模块exports,至少一个包,没有资格,也是根.否则,默认的根模块集取决于阶段:
在编译时,通常是编译的模块集(更多内容见下文);
在链接时它是空的; 和
在运行时,它是应用程序的主模块,通过
--module(或简称-m)启动器选项指定.有时需要将模块添加到默认根集,以确保模块图中将存在特定的平台,库或服务提供者模块.在任何阶段的选择
--add-modules <module>(,<module>)*其中<module>是模块名称,将命名模块添加到默认的根模块集.
在jetty.project中遇到了类似的问题,其中来自jdk邮件列表的线程讨论了相同的问题并且使用了修复程序:
--add-modules java.se.ee
Run Code Online (Sandbox Code Playgroud)
这使他们能够访问所有Java SE模块,在您的情况下,它应该只是:
--add-modules java.xml.bind
Run Code Online (Sandbox Code Playgroud)
要在maven中使用它,您可以将其嵌入到maven-compiler-plugin
使用中
<compilerArgs>
<arg>--add-modules</arg>
<arg>java.xml.bind</arg>
</compilerArgs>
Run Code Online (Sandbox Code Playgroud)
正如ZhekaKozlov 在这里所建议的那样.
需要注意的一点是,标记API的弃用也意味着您可能希望远离使用它.为了适应这种方式,您可能开始消耗jaxb-api:2.3.0现在可以作为模块加载的依赖关系,并且也可以从类路径执行.您需要进行的更改是将以下内容添加到依赖项列表中:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
更新: - 最后,随着Java-10的推出和接下来的JDK/11,理想情况下应该遵循 JEP 320的链接:删除Java EE和CORBA模块,并进一步用它们的独立库替换这些依赖.
Zhe*_*lov 11
是的,你必须传递--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>
Run Code Online (Sandbox Code Playgroud)
然后你的项目应该编译好.
JAXB以及与Java EE共享的其他API(JAX-WS,JAF,JTA和所谓的"公共注释")在Java SE 9中已弃用,建议在将来的Java SE版本中删除它们. JDK.这些API中的每一个都具有独立版本/下载.每个API都有自己的JSR来维护它.从包含在JDK中的API过渡到独立版本当然会有点破坏性.
从Java SE和JDK中删除这些API的第一步是默认情况下不解析包含这些API的模块.当您使用JDK 9在类路径上编译或运行代码时,最初会显示API不存在.如另一个答案所述,快速解决方法是编译或运行--add-modules java.xml.bind.这CLI选项添加"java.xml.bind"模块设置的根模块在启动时解决,并与JDK 9起作用,因为该模块包含在JDK运行时映像中.
除了快速解决方法之外,使用JAXB的应用程序或库将需要转向使用独立版本的API /实现.JAXB 2.3.0即将发布到Maven Central,它包含了对JDK 9及更高版本的更改.独立版本可以像其他JAR文件一样部署在类路径上.最终可以在(升级)模块路径上部署独立版本,并将其用作模块.JDK 9迁移指南将提供有关迁移使用JAXB或与Java EE共享的其他API的代码的选项的更多信息.
| 归档时间: |
|
| 查看次数: |
11145 次 |
| 最近记录: |