如何从Maven reactor构build中排除模块?
我们有一个有很多模块的Maven 2项目。 例:
<modules> <module>common</module> <module>foo</module> <module>data</module> <module>bar</module> ... more ... </module>
假设“数据”模块的构build耗时,并且我们希望在项目由CI服务器构build时将其排除。 目前我们使用两个pom.xml文件来实现这一点。 一个拥有所有的模块,另一个拥有除了可以省略的CI之外的所有模块。 但是,这很烦人,因为有时我们忘记把一个新的模块放到这两个文件中。
有没有一个解决scheme,不需要两个单独的模块列表?
最简单的可能是使用这样的profiles
:
<project> ... <modules> <module>common</module> <module>foo</module> <module>bar</module> <modules> ... <profiles> <profile> <id>expensive-modules-to-build</id> <modules> <module>data</module> </modules> </profile> </profiles> </project>
然后,你应该检查你可以激活configuration文件的方式
使用Maven 3.2.1,现在可以使用-pl !<module_name>,!<module_name>
从反应器构build中排除某些模块。
请参阅此function请求: https : //jira.codehaus.org/browse/MNG-5230
也可以在mvn命令行中指定要构build的项目。 这将消除需要一个单独的POM,但相反,每当有一个新的模块,你将不得不改变CIconfiguration。
-pl,--projects <arg> Comma-delimited list of specified reactor projects to build instead of all projects. A project can be specified by [groupId]:artifactId or by its relative path.
也许这个标志和--also-make-dependents
的组合也可以减less这种维护负担。
-am,--also-make If project list is specified, also build projects required by the list -amd,--also-make-dependents If project list is specified, also build projects that depend on projects on the list
我假设你希望默认构build总是能够构build一切,无论速度如何,这样新开发人员就可以快速入门,而不必了解POM的大量信息。 你可以使用这样的configuration文件:
<modules> <module>common</module> <module>foo</module> <module>bar</module> </modules> ... <profiles> <profile> <id>expensive-modules-to-build</id> <activation> <activeByDefault>true</activeByDefault> </activation> <modules> <module>data</module> </modules> </profile> </profiles> </project>
问题在于,如果开发人员在命令行中指定了另一个configuration文件,则不包含expensive-modules-to-build
(除非开发人员也指定了它)。 这使得记住需要包含哪些configuration文件变得复杂。
这是一个黑客的方式。 这两个configuration文件总是包含在内,因为pom.xml文件总是存在。 因此,要排除昂贵的模块,可以在命令行上使用-P!full-build
。
<profiles> <profile> <id>full-build</id> <activation> <file> <exists>pom.xml</exists> </file> </activation> <modules> <module>data</module> </modules> </profile> <profile> <id>short-build</id> <activation> <file> <exists>pom.xml</exists> </file> </activation> <modules> <module>common</module> <module>foo</module> <module>bar</module> </modules> </profile> </profiles>
另一个想法是:反应器模块可以嵌套,所以应该可以将快速构build模块和缓慢构build模块分组为单独的poms,然后添加另一个包含这两个模块的聚合器pom。 然后你的CI服务器只能引用包含快速构build模块的pom。
<artifactId>fast</artifactId> <modules> <module>fast-a</module> <module>fast-b</module> <module>fast-c</module> </module> <artifactId>all</artifactId> <modules> <module>fast</module> <module>slow</module> </module>
你可能会使用maven configuration文件 。 在我们的构build环境中,我们quick
创build了一个configuration文件,禁用许多插件并testing执行。
这是通过
<profile> <id>quick</id> <properties> <skipTests>true</skipTests> <!-- others... --> </properties> <build> <plugins> <!-- configuration... --> </plugins> </build> </profile>
然后我们用下面的方法调用maven
mvn groupId:artifactId:goal -P quick
你也许可以在你的模块中禁用编译和其他标准插件来加速。
- Eclipse / Maven:运行时未编译的JUnittesting
- pom xml中的依赖和插件标签之间maven有什么区别?
- 在“更新Maven项目”期间发生内部错误。 显示java.lang.NullPointerException
- 如何使“maven-enforcer-plugin(goal”强制执行“)被m2e忽略”eclipse警告?
- Maven – 总是下载源代码和javadocs
- 摆脱POM没有发现警告org.eclipse.m2e:生命周期映射
- 什么是maven中的“pom”包装?
- Gradle版本1.10是必需的。 当前版本是2.0
- IntelliJ IDEA:Maven,项目编译和部署