如何在Maven反应堆构建中排除一个模块及其子模块?

5

这个问题已经被问了很多次,但是我没有找到解决方案,如何禁用一个模块的子模块?!

例如: 我想禁用项目BB和CC以及它们的子模块。

A
|-AA
|  |--AAA
|-BB
|  |-BBB
|-CC
   |-CCC

但是当我运行这个

mvn -pl \!AA,\!BB clean install

我看到BBB和CCC也被执行了。这只是一个示例。我们有一个多模块项目,大约有一百个项目...所以我不想列出所有的项目,只想列出父级项目。这可行吗?
谢谢。

我们有一个多模块项目,大约有一百个子项目,这听起来有点可怕 :) - A_Di-Matteo
这就是现实 :) - pan40
1个回答

3

您可以使用Maven配置文件来实现您的目的。

在父项目中,您可以定义一个配置文件,覆盖modules部分并提供所有所需的模块。这样的配置文件默认情况下将处于活动状态,因此不会改变预期的行为。

然而,普通POM(不包含配置文件)的modules部分将为空。请注意,我们无法做相反的操作(这更有意义):我刚试过了,但它没有起作用。

因此,这样一个示例POM看起来像:

<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>com.sample</groupId>
<artifactId>test3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
</modules>

<profiles>
    <profile>
        <id>aggregator</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <modules>
            <module>..\test</module>
            <module>..\test2</module>
        </modules>
    </profile>
</profiles>

执行中:
mvn clean install

Maven会激活配置文件并按预期执行聚合构建。因此,没有回归问题。
但是,在执行以下操作时:
mvn clean install -P!aggregator

Maven将停用上述配置文件,并执行一个反应堆构建,不使用任何模块,仅执行父级,如您所愿。
可惜我的测试中反向方法(空模块配置文件)没有起作用,但这种方法应该会给您足够的提示,以达到您的目标。
更新
您实际上正在使用自Maven 3.2.1以来提供的this new feature。从任务评论中可以看到,有人问了同样的问题:

如何排除嵌套模块?我尝试了新功能,似乎:
  1. 当排除顶部模块时,其嵌套模块不会被排除。
  2. 不可能直接排除嵌套模块。

答案是:

父模块不会排除子模块。   排除方法模仿包含方法,其匹配器不支持通配符等。   因此,要级联排除将需要一个额外的标志,例如-amd。   使用-pl时,依赖关系图在以下顺序下进行过滤:
  1. 包括的项目+可能的上游和下游
  2. 已排除的项目
  3. 跳过恢复项目
  因此,应该可以直接排除嵌套模块,因为它们应该在过滤开始之前出现在初始依赖关系图中。


嗨,感谢您的回答。我的初衷并不是使用配置文件,因为我们内部团队结构的原因...但我会考虑一下。我们使用的是maven 3.2.3,但我无法理解这篇文章所指的新功能是什么。“-el”不是一个现有的maven选项。 - pan40
我会更新我的回答,你实际上正在使用它,-el建议被弃用,而是采用了-pl!子模块。然而,在评论中有人提出了与你完全相同的问题。 - A_Di-Matteo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接