我需要使用Maven构建具有非模块化依赖项的JDK 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编译器插件,如下所述。当然,我已经下载了带有拼图的JDK 9 EA

bu​​ild,并设置了Maven以使用它。

如果我不使用来构建项目module-

info.java,则一切正常,则将所有内容添加到类路径中,并且构建成功。我想只要您不考虑该文件,Maven就会坚持旧方法。

但是, 使用with进行 构建会module-

info.java告诉我,我的依赖项中的类无法在classpath上找到。因此,我在调试模式下(带有-X)运行了Maven,实际上-

。这实际上意味着我所有的依赖项都已 ,我需要在中声明它们module-info.java

声明自动模块要求(链接到项目的module-info)后, 。但这有点杂乱-

我唯一的pom.xml依赖就在了weld-se-core,但是我module-info要求我声明 更多的要求 才能通过编译。

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

所以我的问题是:

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

回答:

包括一些最近的更新,我会 尽力 回答。

更新

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

  • 该最低兼容版本的maven-compiler-plugin在今天的日期3.7.0

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

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

如果我知道一些构件不是模块化的,我可以告诉Maven将它们放在classpath上吗?这样我就可以避免自动模块,而无需声明它们?

对于在maven pom中指定的工件<dependencies>以及module-info.java当前模块中未包括的工件,最终都将其留下,以

未命名模块的 形式从类路径中进行访问

如果我坚持使用自动模块,是否可以告诉Maven以某种方式可传递地允许我的依赖项需要引入的任何内容?例如Weld,CDI API等的其他部分。

,因为自动模块不包含显式声明的module-info.java,所以没有这种方法可以定义 _ _ 当前模块可能需要的任何传递依赖。

从我的一个过去的经验,如在详细Maven的任何传递依赖dependency:tree的是需要在该模块编译时就必须使用被明确定义requiresmodule-info当前项目中。

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

  • 您不需要requires为模块指定在编译或运行时不需要的模块。

  • 如果项目在运行时不需要某个依赖关系,而在编译时需要一个依赖关系,则需要确保 _ _ 在声明中使用定义此类模块。

以上是 我需要使用Maven构建具有非模块化依赖项的JDK 9项目 的全部内容, 来源链接: utcz.com/qa/402941.html

回到顶部