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