如何为多模块项目的一个模块执行不同的目标?

时间:2010-11-05 21:01:21

标签: maven-2

我有一个由两个不同模块组成的项目。我无法控制这些模块的pom文件,因此无法更改它们。我完全控制了项目pom文件。项目ID未定义为模块中的父项。

文件夹结构:

project
 + module1
 + module2

作为解决方案的一部分,我需要为两个模块执行两个不同的目标,以便将module1安装到本地存储库,而不是module2。这只是一个例子。我的实际问题包含每个级别超过2个模块的更多级别。

为了最小化我的CI系统所需的配置,我想在一个maven调用中运行它。

我正在“梦想”某些事情

mvn install -Dspecial=module:compile

这是可能的吗?如果可以,我该怎么做?

2 个答案:

答案 0 :(得分:28)

  

(...)为了最小化我的CI系统所需的配置,我想在一个maven呼叫中运行它。

我担心这是不可能的。正如我在this answer中解释的那样,作为多模块构建的一部分调用的阶段或目标是针对所有模块运行的。

如果您想为子模块的子集运行不同的阶段或目标,则必须两次调用maven,可能使用--projects-pl选项来选择正确的子集:

  • mvn -pl module1,module3 somegoal
  • mvn -pl module2 someothergoal

答案 1 :(得分:2)

控制 目标 / 执行 的唯一方法(不是 阶段< / em> )在Maven构建期间执行,无论您的项目是否具有模块,都是通过配置文件。

例如:

/pom.xml

findFragmentById()

/module1/pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.company</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>module1</module>
        <module>module2</module>
    </modules>
</project>

/module2/pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.company</groupId>
        <artifactId>parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>module1</artifactId>
</project>

运行<project> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.company</groupId> <artifactId>parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>module2</artifactId> <profiles> <profile> <id>module2:ignore-compile</id> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <executions> <execution> <id>default-compile</id> <phase>none</phase> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> </project> 时。您会注意到module2将忽略源编译(但只有这个目标/执行!)。

您还可以使用mvn -Pmodule2:ignore-compile package

activation

然后使用命令:<profiles> <profile> <id>module2:ignore-compile</id> <activation> <property> <name>module2:ignore-compile</name> </property> </activation> .... </profile> </profiles>

最后,一个有趣的功能是通过配置文件更改模块:

/pom.xml

mvn -Dmodule2:ignore-compile package

忽略<project> <modelVersion>4.0.0</modelVersion> <groupId>com.company</groupId> <artifactId>parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>module1</module> </modules> <profiles> <profile> <id>with:module2</id> <activation> <activeByDefault>true</activeByDefault> </activation> <modules> <module>module2</module> </modules> </profile> </profiles> </project> module2