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

Sil*_*rus 12 java maven java-platform-module-system java-9

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

请记住,我唯一的依赖是不是一个模块化的项目,因此,我认为Maven会放在类路径中(不模块路径),因此它会在结束unnamed module中描述的模块化系统的状态.

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

如果我没有构建我的项目module-info.java,一切正常,将东西添加到类路径并构建成功.我想只要你遗漏那个文件,Maven就会坚持旧的方式.

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

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

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

所以我的问题是:

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

Nam*_*man 2

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

更新

  • 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,因此没有这样的方法来定义requires transitive当前模块可能需要的任何传递依赖项。

根据我过去的经验之一,模块在编译时所需的任何 Maven 传递依赖项(如 中详细说明的)dependency:tree都必须使用当前项目的 中requires显式定义。module-info

真正的原因是什么,为什么我需要声明,我的项目需要模块,但我不直接使用?例如weld.environment.common**

  • 我几乎想通了我(很久?)很久以前问过的所有问题,但我忘记了我首先问过这个 - 对我来说真丢脸。你的回答总结得很好,我会接受的。 (2认同)