【问题标题】:How to exclude a module and its child modules from a Maven reactor build?如何从 Maven 反应器构建中排除模块及其子模块?
【发布时间】:2016-04-26 03:06:15
【问题描述】:

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

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

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

但是当我运行这个

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

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

谢谢

【问题讨论】:

  • “我们有一个包含大约一百个项目的多模块项目”,这听起来相当可怕 :)
  • 这就是现实:)

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


【解决方案1】:

您可以将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。从票上的 cmets 中,有人提出了同样的问题:

排除嵌套模块怎么样?我尝试了新功能,似乎:
1. 排除顶层模块时,不排除其嵌套模块。
2. 不能直接排除嵌套模块。

答案是:

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

【讨论】:

  • 您好,感谢您的回答,我的第一个目的不是使用个人资料,因为我们的内部团队结构......但我会考虑的。我们使用 maven 3.2.3,但我不明白这篇文章是指哪个新功能。 -el 不是现有的 Maven 选项
  • 我会更新我的答案,你实际上正在使用它, -el 建议被丢弃,取而代之的是 -pl !sub-module。但是,在 cmets 中,有人提出了完全相同的问题
猜你喜欢
  • 2011-07-29
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
相关资源
最近更新 更多