java 模块依赖_java-在多模块项目构建期间模块之间的Maven依赖关系解析

我遇到了一些以前没有想到的Maven行为.

例如,我们有一个多模块项目A:

A

|

--- api

--- impl

impl模块使用api作为依赖项:

examle

api

当我为整个应用程序运行mvn clean测试时,maven成功完成.

当我为impl模块执行相同的命令时,它们的maven失败,并出现以下异常:

[ERROR] Failed to execute goal on project impl: Could not resolve

dependencies for project A:impl:jar:1.0-SNAPSHOT: Could not find artifact

A:api:jar:1.0-SNAPSHOT in maven-public

因此,我的问题是maven如何解决未构建到jar文件中并推送到本地/远程存储库中的依赖项.在所有教程中,都说过maven在本地存储库中寻找依赖项,如果找不到它,那么它将在远程回购中进行搜索,并且对SNAPSHOTS的行为几乎没有什么不同.

但就我而言,我运行测试阶段,即使在目标存储库中也不构建jar文件

解决方法:

为了清楚起见,您从多模块项目运行此命令时注意到了此行为:

mvn clean test

但是您将具有相同的行为,即:无需在运行任何阶段的情况下就将模块之间的依赖关系解析并可用,而无需事先将它们安装在本地存储库中,例如:

mvn test

mvn compile

mvn package

实际上,关于这一点的Maven文档并不明确.

The Reactor

The mechanism in Maven that handles multi-module projects is referred

to as the reactor. This part of the Maven core does the following:

Collects all the available modules to build

Sorts the projects into the correct build order

Builds the selected projects in order

您可以猜测,如果模块的顺序对于Maven构建很重要,则可能意味着模块的构建依赖于先前构建的相关模块的构建.这解释了如果您在< modules>中指定的顺序是由反应器完成的排序.就依赖关系而言是不正确的(正确的顺序是必须在用户依赖关系之前声明所使用的依赖关系).

当然,在某些用例中,您需要将Maven工件安装到本地存储库中,例如(并非详尽无遗):

>您不使用多模块项目

>整个多模块项目的构建很长.您只希望通过构建一些特定的工件来节省时间,因此无需构建多模块项目.

>多模块项目中包含的一个或几个模块由其他项目共享/使用.

通过使用-X标志(调试标志)执行maven build命令,您将看到Maven为每个模块构建计算模块之间的依赖关系.

例如,在您的示例中,您应该看到impl构建:

DEBUG] === PROJECT BUILD PLAN

================================================

[DEBUG] Project: A:impl:0.0.1-SNAPSHOT

[DEBUG] Dependencies (collect): []

[DEBUG] Dependencies (resolve): [compile, test]

稍后再检测模块间的依赖关系:

[DEBUG] A:impl:jar:0.0.1-SNAPSHOT

[DEBUG] A:api:jar:0.0.1-SNAPSHOT:compile

这是以下内容的更详细摘录:

[DEBUG] =======================================================================

[DEBUG] Dependency collection stats: {ConflictMarker.analyzeTime=23166, ConflictMarker.markTime=13490, ConflictMarker.nodeCount=2, ConflictIdSorter.graphTime=31377, ConflictIdSorter.topsortTime=6158, ConflictIdSorter.conflictIdCount=1, ConflictIdSorter.conflictIdCycleCount=0, ConflictResolver.totalTime=51611, ConflictResolver.conflictItemCount=1, DefaultDependencyCollector.collectTime=368903, DefaultDependencyCollector.transformTime=134014}

[DEBUG] A:impl:jar:0.0.1-SNAPSHOT

[DEBUG] A:api:jar:0.0.1-SNAPSHOT:compile

因此,在构建impl期间执行的插件还将具有一个类路径,其中包括api模块的已编译类.

例如,编译器插件执行的调试跟踪显示:

[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ impl ---

...

[DEBUG] (f) classpathElements = [C:\...\test-parent-pom\impl\target\classes, C:\...\test-parent-pom\api\target\classes]

标签:multi-module,maven,java,maven-dependency

来源: https://codeday.me/bug/20191025/1925718.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值