我有一个由两个不同模块组成的项目。我无法控制这些模块的pom文件,因此无法更改它们。我完全控制了项目pom文件。项目ID未定义为模块中的父项。
文件夹结构:
project
+ module1
+ module2
作为解决方案的一部分,我需要为两个模块执行两个不同的目标,以便将module1安装到本地存储库,而不是module2。这只是一个例子。我的实际问题包含每个级别超过2个模块的更多级别。
为了最小化我的CI系统所需的配置,我想在一个maven调用中运行它。
我正在“梦想”某些事情
mvn install -Dspecial=module:compile
这是可能的吗?如果可以,我该怎么做?
答案 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