如何从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 

你也许可以在你的模块中禁用编译和其他标准插件来加速。