我们需要在某些环境下跳过一个子模块。
有关的模块包含集成测试,需要半小时才能运行。因此,我们想在CI服务器上进行构建时包含它,但当开发人员本地构建(并运行测试)时,我们要跳过该模块。
是否可以通过配置文件进行设置?我已经做了一些搜索并查看了其他问题/答案,但没有找到好的解决方案。
我想其中一个选项是完全从父pom.xml
中移除该子模块,并在我们的CI服务器上添加另一个项目来构建该模块。
有什么建议吗?
我们需要在某些环境下跳过一个子模块。
有关的模块包含集成测试,需要半小时才能运行。因此,我们想在CI服务器上进行构建时包含它,但当开发人员本地构建(并运行测试)时,我们要跳过该模块。
是否可以通过配置文件进行设置?我已经做了一些搜索并查看了其他问题/答案,但没有找到好的解决方案。
我想其中一个选项是完全从父pom.xml
中移除该子模块,并在我们的CI服务器上添加另一个项目来构建该模块。
有什么建议吗?
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
编辑:Windows似乎不喜欢单引号,但在bash中是必需的;在Windows中,请使用双引号(感谢@awilkinson)。
mvn -pl "!submodule1,!submodule2" install
mvn -pl !com.acme:nestedmodule1
。 - Leonard Brüningsmvn -pl '!path/to/submodule/directory'
命令,而不需要使用groupId和artifactId。如果submodule1
和submodule2
在当前目录中,我的答案就适用。 - Alexandre DuBreuilmvn install
命令中使用了-pl
选项,则很可能需要在mvn deploy
命令中也使用它。 - chizoumvn -pl“!submodule1,!submodule2”clean install
- Tarun Kumar当然,这可以通过配置文件(profiles)来完成。您可以在您的父级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
)以便能够跳过它们。 - denishaskin可以通过指定 -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
-el
标志来排除反应堆中的项目,类似于-pl
的功能。mvn install -pl .
命令,只安装父POM到本地仓库而不构建模块。 - Marcin目前这里给出的命令行使用答案在较新版本的maven上(至少3.8)不起作用。你还需要添加 ':'。
mvn -pl '!:mymodule' install
多模块项目的概念是为了服务于项目的相互依存的部分需求。这样的客户端依赖于服务,而服务又依赖于例如EJBs或数据访问例程。你可以按此方式分组你的持续集成(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>
在您的模块中,Pit会跳过
[INFO] --- pitest-maven:1.1.3:mutationCoverage (default-cli) @ module-selenium --- [INFO] 跳过项目