Maven项目有2个子模块,a和b:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo</groupId>
<artifactId>foo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>a</module>
<module>b</module>
</modules>
</project>
模块A是
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>foo</groupId>
<artifactId>foo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>a</artifactId>
</project>
模块B依赖于A:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>foo</groupId>
<artifactId>foo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>b</artifactId>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>a</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
install
阶段从未执行过。 mvn compile
关于根工作。 Q上的mvn compile
失败了。我没想到mvn compile
在根上工作。
即使排除了所有A类,模块B也会编译:
[...]
<artifactId>a</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<excludes>
<exclude>**/*</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
我不明白,我没有找到为什么mvn compile
在根工作的参考。我一直认为必须安装其他模块可见的模块。
我正在寻找更多关于为什么以及如何在构建模块时使用类路径/类加载器而不是对反应器排序的解释来解释为何以及如何使用类似路径/类加载器的解释(理想地链接到ref doc)。
谢谢你的帮助
TLDR:由于reactor应该归咎于的执行环境。
长版:
构建需要依赖关系的单个模块意味着依赖关系必须存在或者在本地存储库中下载。由于它是您无法从远程仓库下载的模块之一,也未安装在本地仓库中,因此构建将失败。
但是,在构建父模块时,maven将查看是否存在依赖于其他模块的模块,并以适当的顺序构建它们,因此在需要时它们将在上下文中可用。来自文档:
反应器排序
由于多模块构建中的模块可以相互依赖,因此反应堆必须以保证在需要之前构建任何项目的方式对所有项目进行排序。
排序项目时遵循以下关系:
- 项目依赖于构建中的另一个模块
- 插件声明,其中插件是构建中的另一个模块
- 插件依赖于构建中的另一个模块
- 构建中另一个模块的构建扩展声明
- 在
<modules>
元素中声明的顺序(如果没有其他规则适用)
在现实生活中很难找到类比,但也许这样做: