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 build并设置了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项目,可以观察到所有这些.
所以我的问题是:
automatic module并且需要声明它们?automatic module,我可以告诉Maven以某种方式过渡性地允许我的依赖需要引入的任何东西吗?例如Weld的其他部分,CDI API等.requires模块,我不直接使用?例如weld.environment.common包括最近的一些更新,我会尝试回答这个问题。
更新
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**
您无需指定requires模块在编译或运行时不需要的模块。
如果项目在运行时不需要但在编译时需要依赖项,则需要确保requires static在声明中使用定义此类模块。
我目前最好也采用类似的方法,正如我应该保留还是删除声明的依赖项(也是传递依赖项)的答案中所述。
| 归档时间: |
|
| 查看次数: |
1836 次 |
| 最近记录: |