我们需要能够在某些环境中跳过子模块。有问题的模块包含集成测试,需要半个小时才能运行。因此,我们希望在CI服务器上构建时包含它,但当开发人员在本地构建(并运行测试)时,我们希望跳过该模块。有没有一种方法可以通过配置文件设置来做到这一点?我已经做了一些谷歌搜索,看看其他问题/答案在这里,并没有找到一个好的解决方案。我认为一种选择是从父pom.xml中完全删除该子模块,并在CI服务器上添加另一个项目来构建该模块。有什么建议?
pom.xml
vatpfxk51#
Maven 3.2.1版增加了这个功能,可以使用-pl开关(shortcut for --projects list)配合!或-(源码)来排除某些子模块。
-pl
--projects
!
-
mvn -pl '!submodule-to-exclude' install mvn -pl -submodule-to-exclude install
小心打击的性格!是一个特殊字符,所以你要么用单引号(就像我做的那样),要么用反斜杠字符转义它。排除多个模块的语法与包含相同
mvn -pl '!submodule1,!submodule2' install mvn -pl -submodule1,-submodule2 install
EDITWindows似乎不喜欢单引号,但在bash中是必要的;在Windows中,使用双引号(感谢@awilkinson)
mvn -pl "!submodule1,!submodule2" install
nlejzf6q2#
当然,这可以通过配置文件来完成。您可以在父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
ci
mvn -P ci clean install
zte4gxcn3#
可以通过指定-pl命令行参数来决定要构建哪些reactor项目:
$ 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开始,a new -el flag将项目从reactor中排除,类似于-pl的做法:
-el
nnsrf1az4#
这里给出的命令行用法的答案目前在较新版本的maven上不起作用(至少3.8)您还需要添加':'
mvn -pl '!:mymodule' install
iklwldmw5#
多模块项目的概念是为了满足项目中相互依赖的部分的需求。这样的客户机依赖于服务,而服务又依赖于EJB或数据访问例程。您可以以这种方式对持续集成(CI)测试进行分组。我会合理地说,CI测试需要与应用程序逻辑更改保持同步。假设您的项目结构为:
project-root | + --- ci | + --- client | + --- server
project-root/pom.xml定义模块
project-root/pom.xml
<modules> <module>ci</module> <module>client</module> <module>server</module> </modules>
ci/pom.xml定义了如下配置文件:
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网站有一个in-depth explanation of the profiling mechanism。
CI
mvn clean package -P CI
rqdpfwrv6#
现在(从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>
在你的模块中,pit将跳过[INFO] - pitest-maven:1.1.3:mutationCoverage(default-coverage)@ module-selenium- [INFO]正在跳过项目
6条答案
按热度按时间vatpfxk51#
Maven 3.2.1版增加了这个功能,可以使用
-pl
开关(shortcut for--projects
list)配合!
或-
(源码)来排除某些子模块。小心打击的性格!是一个特殊字符,所以你要么用单引号(就像我做的那样),要么用反斜杠字符转义它。
排除多个模块的语法与包含相同
EDITWindows似乎不喜欢单引号,但在bash中是必要的;在Windows中,使用双引号(感谢@awilkinson)
nlejzf6q2#
当然,这可以通过配置文件来完成。您可以在父pom.xml中执行以下操作。
在您的CI中,您可以使用
ci
配置文件运行maven,即mvn -P ci clean install
zte4gxcn3#
可以通过指定
-pl
命令行参数来决定要构建哪些reactor项目:它接受以下形式之一的逗号分隔的参数列表:
[groupId]:artifactId
因此,给定以下结构:
可以指定以下命令行:
来建造一切删除列表中的元素以仅构建您喜欢的模块。
编辑:正如blackbuild所指出的,从Maven 3.2.1开始,a new
-el
flag将项目从reactor中排除,类似于-pl
的做法:nnsrf1az4#
这里给出的命令行用法的答案目前在较新版本的maven上不起作用(至少3.8)您还需要添加':'
iklwldmw5#
多模块项目的概念是为了满足项目中相互依赖的部分的需求。这样的客户机依赖于服务,而服务又依赖于EJB或数据访问例程。您可以以这种方式对持续集成(CI)测试进行分组。我会合理地说,CI测试需要与应用程序逻辑更改保持同步。
假设您的项目结构为:
project-root/pom.xml
定义模块ci/pom.xml
定义了如下配置文件:这将导致Maven跳过此模块中的测试,除非名为
CI
的配置文件处于活动状态。必须指示CI服务器执行mvn clean package -P CI
。Maven网站有一个in-depth explanation of the profiling mechanism。rqdpfwrv6#
现在(从1.1.1版本开始)在pit中有一个“skip”标志。
所以你可以做这样的事情:
在你的模块中,pit将跳过
[INFO] - pitest-maven:1.1.3:mutationCoverage(default-coverage)@ module-selenium- [INFO]正在跳过项目