使用 Maven 构建具有非模块化依赖项的 JDK 9 项目需要什么

我有一个简单的Java 9 SE项目,其中一个依赖于非模块化项目(在本例中选择Weld SE),我正在尝试使用Maven()构建它。为了让Java 9发挥作用,我添加了.最初,此文件仅包含模块名称,没有公式。clean installmodule-info.javarequires

请记住,我唯一的依赖项不是模块化项目,因此我认为Maven将放入类路径(不是模块路径),因此它将最终进入模块化系统状态中所述。unnamed module

现在,我的Maven版本是3.3.9,我知道我需要在3.6版本中使用Maven编译器插件,如这里所述,当然我已经下载了带有拼图的JDK 9 EA构建,并将Maven设置为使用它。

如果我在没有 的情况下构建我的项目,一切都可以正常工作,将内容添加到类路径中并生成成功。我想Maven只是坚持旧的方式,只要你省略那个文件。module-info.java

但是,构建它告诉我,在类路径上找不到来自依赖项的类。所以我在调试模式下运行了Maven(使用-X),实际上 - 所有jar都在模块路径下,类路径是空的。这实际上意味着我的所有依赖项都转移到自动模块,我需要在 中声明它们。module-info.javamodule-info.java

一旦我声明了自动模块需求(链接到项目),我就能够在JDK 9上构建它。但它有点混乱 - 我唯一的依赖是,但我要求我声明更多的编译要求才能通过。module-infopom.xmlweld-se-coremodule-info

这是一个完整的GitHub项目,可以观察到所有这些。

所以我的问题是:

  1. 如果我知道一些工件不是模块化的,我能告诉Maven在类路径上放置它们吗?这样我就可以避免自动模块和需要声明它们吗?
  2. 如果我坚持使用自动模块,我能告诉Maven以某种方式传递允许我的依赖关系需要引入的任何东西吗?例如,Weld的其他部分,CDI API等。
  3. 为什么我需要声明我的项目需要模块,我不直接使用模块的实际原因是什么?例如weld.environment.common

答案 1

包括最近的一些更新,我会尝试回答这个问题。

更新

  • Java 9 于 2017 年 9 月 21 日公开发布。

  • 今天日期的最低兼容版本是 。maven-compiler-plugin3.7.0

    正如@Tunaki已经分享了如何配置它以为JDK 1.5到8和JDK 9构建兼容版本。

假设从问题和注释中,您已经知道自动模块并将所有模块依赖项放在模块路径上。

如果我知道一些工件不是模块化的,我能告诉Maven在类路径上放置它们吗?这样我就可以避免自动模块和需要声明它们吗?

对于在 maven pom 中指定的工件以及当前模块中未包含的工件,最终将以未命名模块的形式从类路径访问。<dependencies>module-info.java

如果我坚持使用自动模块,我能告诉Maven以某种方式传递允许我的依赖关系需要引入的任何东西吗?例如,Weld的其他部分,CDI API等。

,因为自动模块不是由显式声明的,所以对于本模块可能需要的任何传递依赖关系,没有这样的方法来定义需要传递。module-info.java

根据我过去的经验之一,模块在编译时需要的任何Maven传递依赖关系都必须在当前项目中使用显式定义。dependency:treerequiresmodule-info

为什么我需要声明我的项目需要模块,我不直接使用模块,这是什么实际原因?例如,焊接.环境.常见**


答案 2

我认为这可能有助于告诉maven使用java 9:

    <build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

推荐