为了清楚起见,您注意到从多模块项目运行此命令时的这种行为:
mvn clean test
但是您将有相同的行为,即:在模块之间解决依赖关系并使其可用,而无需事先将它们安装在本地存储库中,并运行任何阶段,例如:
mvn test
mvn compile
mvn package
事实上,关于这一点的 Maven 文档并不明确。
您可以在the Guide to Working with Multiple Modules阅读:
反应堆
Maven中处理多模块项目的机制被引用
作为反应堆。这部分 Maven 核心执行以下操作:
收集所有可用模块进行构建
将项目排序为正确的构建顺序
按顺序构建选定的项目
你可以猜到,如果模块的顺序对 Maven 构建很重要,这可能意味着模块的构建依赖于先前构建的依赖模块的构建。这解释了如果您在 <modules> 中指定的顺序在依赖项方面不正确(正确的顺序是必须在用户依赖项之前声明使用的依赖项),则反应器完成的排序。
当然,在某些用例中,您希望将 maven 工件安装到本地存储库中,例如(并非详尽无遗):
- 您没有使用多模块项目
- 整个多模块项目的构建很长。您只需要构建一些特定的工件来获得空闲时间,因此无需构建多模块项目。
- 多模块项目中包含的一个或多个模块被其他项目共享/使用。
通过使用 -X 标志(调试标志)执行 maven 构建命令,您将看到 Maven 计算每个模块构建的模块之间的依赖关系。
例如,在您的示例中,您应该看到 impl 构建:
调试] === 项目构建计划
=================================================
[调试] 项目:A:impl:0.0.1-SNAPSHOT
[DEBUG] 依赖项(收集):[]
[DEBUG] 依赖(解决):[编译,测试]
稍后检测模块间依赖关系:
[调试] A:impl:jar:0.0.1-SNAPSHOT
[调试] A:api:jar:0.0.1-SNAPSHOT:compile
以下是更详细的摘录:
[调试] ================================================= =========================
[DEBUG] 依赖收集统计信息:{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}
[调试] A:impl:jar:0.0.1-SNAPSHOT
[调试] A:api:jar:0.0.1-SNAPSHOT:compile
因此,在构建 impl 期间执行的插件也将具有包含 api 模块的已编译类的类路径。
例如编译器插件执行的调试痕迹显示:
[信息] --- maven-compiler-plugin:3.1:compile (default-compile) @ impl ---
...
[调试] (f) 类路径元素 = [C:\...\test-parent-pom\impl\target\classes, C:\...\test-parent-pom\api\target\classes]