如何在 maven 中表达对 java ee 功能的依赖性,以便过渡到 Java 9?

我们使用并拥有依赖于其他内部工件的工件。我正在迁移到,并打算首先将所有内容迁移到Java 9,而无需模块化代码(即在未命名的模块中)。maven

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


答案 1

模块系统讲述了未命名模块的方式,就像从类路径加载应用程序构建模块图一样。此外,从文档本身来看:-

当编译器在未命名模块中编译代码,或者调用 java 启动器并将应用程序的主类从类路径加载到应用程序类装入器的未命名模块中时,将按如下方式计算未命名模块的默认根模块集:

  • 该模块是根(如果存在)。如果它不存在,则升级模块路径上或系统模块中的每个模块中至少有一个软件包(没有限定)都是根。java.sejava.*exports

  • 升级模块路径或系统模块中的每个模块中至少有一个软件包,没有限定,也是根。non-java.*exports

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

  • 在编译时,它通常是正在编译的模块集(下面将详细介绍);

  • 在链接时,它是空的;和

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

有时需要将模块添加到默认根集,以确保模块图中存在特定的平台、库或服务提供程序模块。在任何阶段,该选项

--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在这里所建议的那样。


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

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

更新:- 最终,随着Java-10已经发布,JDK / 11紧随其后,理想情况下应该遵循JEP 320的链接:删除Java EE和CORBA模块,并进一步用它们的独立库替换这些依赖项。


答案 2

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

<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>

然后你的项目应该编译得很好。


推荐