16

我有一个简单的 Java 9 SE 项目,它依赖于一个非模块化项目(本示例选择 Weld SE),我正在尝试使用 Maven ( clean install) 构建它。为了让 Java 9 启动,我添加了module-info.java. 最初,这个文件只包含模块名称,没有requires公式。

请记住,我唯一的依赖项不是模块化项目,因此我假设 Maven 将放入类路径(而不是模块路径),因此它将以模块化系统状态中所述的方式unnamed module结束。

现在,我的 Maven 版本是 3.3.9,我知道我需要在 3.6 版本中使用 Maven 编译器插件,如此处所述当然我已经下载了 JDK 9 EA bu​​ild with jigsaw 并设置 Maven 使用它。

如果我在没有 的情况下构建我的项目module-info.java,一切正常,东西被添加到类路径并构建成功。我想 Maven 只是坚持使用旧方法,只要您忽略该文件。

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

一旦我声明了自动模块要求(链接到项目的module-info),我就可以在 JDK 9 上构建它。但这有点乱——我唯一的pom.xml依赖是 on weld-se-core,但我module-info要求我声明更多的要求才能通过编译。

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

所以我的问题是:

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

3 回答 3

1

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

更新

  • Java 9 于 21.09.2017 公开发布。

  • 今天的最低兼容版本是.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,所以没有这样的方式来定义requires transitive当前模块可能需要的任何传递依赖。

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

实际原因是什么,为什么我需要说明我的项目需要模块,而我不直接使用这些模块?例如,weld.environment.common**

于 2017-10-04T18:05:41.753 回答
1

我认为这可能有助于告诉 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>
于 2017-11-01T13:15:23.410 回答
0

如果您指定一个module-info.java文件,您将需要声明所有 java 模块java.base,因为您现在使用的是 jigsaw。

Usingmvn dependency:tree可以帮助您填充它,但您不需要module-info.java 在 Java 9 中使用。

于 2017-07-31T22:46:03.793 回答