作者:梨依籽_852 | 来源:互联网 | 2022-12-10 09:57
我遇到了一些以前没有想到的Maven行为。例如,我们有一个多模块项目A:
A
|
--- api
--- impl
impl模块使用api作为依赖项:
examle
api
当我运行mvn clean test
整个应用程序时,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文件
1> davidxxx..:
为了清楚起见,您从多模块项目运行此命令时注意到了此行为:
mvn clean test
但是您将具有相同的行为,即:无需在运行任何阶段的情况下就将模块之间的依赖关系解析并可用,而无需事先将它们安装在本地存储库中,例如:
mvn test
mvn compile
mvn package
实际上,关于这一点的Maven文档并不明确。
您可以阅读《使用多个模块的指南》:
反应堆
Maven中处理多模块项目的机制称为反应堆。Maven核心的这一部分执行以下操作:
收集所有可用模块以进行构建
将项目分类为正确的构建顺序
按顺序构建所选项目
您可以猜测,如果模块的顺序对于Maven构建很重要,则可能意味着模块的构建依赖于先前构建的相关模块的构建。这说明了如果您指定的顺序在
依存关系方面不正确(正确的顺序是所使用的依存关系必须在用户依存关系之前声明)时,反应堆进行的排序。
当然,在某些用例中,您需要将Maven工件安装到本地存储库中,例如(并非详尽无遗):
您不使用多模块项目
整个多模块项目的构建时间很长。您只希望通过构建一些特定的工件来节省时间,因此无需构建多模块项目。
多模块项目中包含的一个或几个模块由其他项目共享/使用。
通过使用带有-X
标志(调试标志)的maven build命令,您将看到Maven为每个模块构建计算模块之间的依赖关系。
例如,在您的示例中,您应该看到impl
构建:
调试] ===项目建设计划
===============================================
[DEBUG]专案:A:impl:0.0.1-SNAPSHOT
[DEBUG]依赖项(收集):[]
[DEBUG]依赖项(解决):[编译,测试]
稍后再检测模块间的依赖关系:
[DEBUG] A:impl:jar:0.0.1-SNAPSHOT
[DEBUG] A:api:jar:0.0.1-SNAPSHOT:compile
这是以下内容的更详细摘录:
[DEBUG] =============================================== ========================
[DEBUG]依赖项收集状态:{ConflictMarker.analyzeTime = 23166,ConflictMarker.markTime = 13490,ConflictMarker.nodeCount = 2,ConflictIdSorter.graphTime = 31377,ConflictIdSorter.topsortTime = 6158,ConflictIdSorter.cOnflictIdCount= 1,ConflictIdSorter。 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]