我们需要能够在某些环境中跳过子模块。
有问题的模块包含集成测试,并且需要半小时才能运行。因此,我们希望在CI服务器上进行构建时将其包括在内,但是当开发人员在本地进行构建(并运行测试)时,我们希望跳过该模块。
有没有办法通过配置文件设置来做到这一点?我已经进行了一些谷歌搜索,并在这里查看了其他问题/答案,但没有找到一个好的解决方案。
我想一个选择是从父级中pom.xml
完全删除该子模块,然后在CI服务器上添加另一个项目以构建该模块。
有什么建议吗?
我们需要能够在某些环境中跳过子模块。
有问题的模块包含集成测试,并且需要半小时才能运行。因此,我们希望在CI服务器上进行构建时将其包括在内,但是当开发人员在本地进行构建(并运行测试)时,我们希望跳过该模块。
有没有办法通过配置文件设置来做到这一点?我已经进行了一些谷歌搜索,并在这里查看了其他问题/答案,但没有找到一个好的解决方案。
我想一个选择是从父级中pom.xml
完全删除该子模块,然后在CI服务器上添加另一个项目以构建该模块。
有什么建议吗?
Answers:
当然,可以使用配置文件来完成。您可以在父pom.xml中执行以下操作。
...
<modules>
<module>module1</module>
<module>module2</module>
...
</modules>
...
<profiles>
<profile>
<id>ci</id>
<modules>
<module>module1</module>
<module>module2</module>
...
<module>module-integration-test</module>
</modules>
</profile>
</profiles>
...
在您的CI中,您将使用ci
配置文件运行maven ,即mvn -P ci clean install
activeByDefault
了该配置文件,然后不得不添加另一个空的配置文件(例如skip-integration-tests
)以能够跳过它们。
Maven版本3.2.1添加了这个功能,你可以使用-pl
开关(快捷键为--projects
列表)有!
或-
(源),以排除某些子模块。
mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install
注意bash角色!是一个特殊字符,因此您必须像我一样单引号或使用反斜杠将其转义。
排除多个模块的语法与包含相同
mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install
EDIT Windows似乎不喜欢单引号,但是在bash中是必须的;在Windows中,使用双引号(感谢@awilkinson)
mvn -pl "!submodule1,!submodule2" install
mvn -pl !com.acme:nestedmodule1
mvn -pl '!path/to/submodule/directory'
,而无需使用groupId和artifactId。如果submodule1
和submodule2
位于当前目录中,我的答案将起作用。
-pl
在mvn install
中使用它,mvn deploy
也
通过指定-pl
命令行参数可以决定要构建哪些反应堆项目:
$ mvn --help
[...]
-pl,--projects <arg> Build specified reactor projects
instead of all projects
[...]
它以下列形式之一接受逗号分隔的参数列表:
[groupId]:artifactId
因此,给出以下结构:
project-root [com.mycorp:parent]
|
+ --- server [com.mycorp:server]
| |
| + --- orm [com.mycorp.server:orm]
|
+ --- client [com.mycorp:client]
您可以指定以下命令行:
mvn -pl .,server,:client,com.mycorp.server:orm clean install
建立一切。删除列表中的元素以仅构建所需的模块。
编辑:正如blackbuild所指出的那样,从Maven 3.2.1开始,您有一个新-el
标志将反应堆中的项目排除在外,类似于 -pl
:
mvn install -pl .
仅在本地回购中安装父pom而不构建模块。
多模块项目的概念可以满足项目中相互依赖的部分的需求。这样的客户端取决于服务,而服务又取决于EJB或数据访问例程。您可以通过这种方式对持续集成(CI)测试进行分组。通过说CI测试需要与应用程序逻辑更改保持同步,我可以将其合理化。
假设您的项目的结构为:
project-root
|
+ --- ci
|
+ --- client
|
+ --- server
该project-root/pom.xml
定义模块
<modules>
<module>ci</module>
<module>client</module>
<module>server</module>
</modules>
的ci/pom.xml
定义配置文件,例如:
...
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</profile>
<profile>
<id>CI</id>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</profile>
</profiles>
这将导致Maven跳过此模块中的测试,除非命名的配置文件CI
处于活动状态。必须指示CI服务器执行mvn clean package -P CI
。Maven网站对配置机制进行了深入的说明。
现在(从1.1.1版本开始)在pit中有一个“ skip”标志。
因此,您可以执行以下操作:
<profile>
<id>pit</id>
<build>
<plugins>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
在您的模块中,坑将跳过
[INFO] --- pitest-maven:1.1.3:mutationCoverage(default-cli)@ module-selenium --- [INFO]跳过项目