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
。 B上的mvn compile
失败了。我并不期望root上的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)。
感谢您的帮助
答案 0 :(得分:0)
TLDR :由于reactor应归咎于执行上下文。
长版:
构建需要依赖关系的单个模块意味着依赖关系必须存在或者在本地存储库中下载。由于它是您的一个模块,无法从远程仓库下载,也没有安装在本地仓库中,因此构建将失败。
但是,在构建父模块时,maven将查看是否存在依赖于其他模块的模块,并以适当的顺序构建它们,因此在需要时它们将在上下文中可用 。来自文档:
反应堆排序
因为多模块构建中的模块可以依赖 在反应堆中,重要的是反应堆对所有项目进行分类 以某种方式保证任何项目在需要之前构建。
在对项目进行排序时,以下关系得到遵守:
- 项目依赖于构建中的另一个模块
- 插件声明,其中插件是构建
中的另一个模块- 构建
中另一个模块的插件依赖项- 构建
中另一个模块的构建扩展声明<modules>
元素中声明的顺序(如果没有其他规则适用)
在现实生活中很难找到类比,但也许这样做: