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

时间:2016-01-20 10:14:17

标签: maven maven-3 pom.xml maven-module

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

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

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

但是当我运行这个

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

您可以将Maven profiles用于您的目的。

在父项目中,您可以定义一个配置文件,该配置文件会覆盖提供所有必需模块的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.跳过简历项目
  所以应该可以直接排除嵌套模块,因为它们应该在过滤开始之前出现在初始依赖图中。