我们有一个Maven 2项目,里面有很多模块。例如:
<modules>
<module>common</module>
<module>foo</module>
<module>data</module>
<module>bar</module>
... more ...
</module>
假设构建“数据”模块非常耗时,我们希望在CI服务器构建项目时将其排除。目前我们使用两个pom.xml文件来实现这一目标。一个包含所有模块,另一个包含所有模块,除了可以省略CI的模块。但这很烦人,因为有时我们忘记将新模块放入两个文件中。
是否有一个不需要两个独立模块列表的解决方案?
答案 0 :(得分:109)
使用Maven 3.2.1,您现在可以使用-pl !<module_name>,!<module_name>
从反应堆构建中排除某些模块。
答案 1 :(得分:70)
最简单的方法是使用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>
答案 2 :(得分:42)
也可以在mvn命令行中指定要构建的项目。这样就不需要单独的pom,而是每次有新模块时都必须更改CI配置。
-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
或--also-make
的组合可能会再次减轻此维护负担。
-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
答案 3 :(得分:20)
我假设您希望默认构建始终构建所有内容,无论速度如何,以便新开发人员可以快速入门,而无需了解有关POM的内容。您可以使用以下配置文件:
<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>
问题在于,如果开发人员在命令行上指定了另一个配置文件,则不包括expensive-modules-to-build
(除非开发人员也指定了它)。这使得记住需要包含哪些配置文件变得复杂。
这是一种愚蠢的方式。始终包含两个配置文件,因为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>
答案 4 :(得分:7)
另一个想法:Reactor模块可以嵌套,因此应该可以将快速和慢速构建模块分组到单独的poms中,然后添加另一个包含这两个模块的聚合器pom。然后,您的CI服务器只能引用包含快速构建模块的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>
答案 5 :(得分:1)
你可以使用maven profiles。在我们的构建环境中,我们创建了一个配置文件quick
,它禁用了许多插件并测试执行。
这是由
完成的 <profile>
<id>quick</id>
<properties>
<skipTests>true</skipTests>
<!-- others... -->
</properties>
<build>
<plugins>
<!-- configuration... -->
</plugins>
</build>
</profile>
然后我们按照以下方式调用maven
mvn groupId:artifactId:goal -P quick
您可以在模块的pom中禁用编译和其他标准插件以加快速度。
答案 6 :(得分:0)
这些人所要求的答案不完全是。我的情况是我只想部署父pom。我在子模块中使用spring-boot-thin-layout
。这要求将父模块部署到构件中。我将以下内容添加到我的项目中。它可以跳过install
和/或deploy
阶段。
在我的父母pom中:
<properties>
<disable.install>true</disable.install>
<disable.deploy>true</disable.deploy>
<enable.deployAtEnd>true</enable.deployAtEnd>
</properties>
<profiles>
<profile>
<id>deploy-parent</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<disable.install>true</disable.install>
<disable.deploy>true</disable.deploy>
<deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>
<build>
<finalName>${project.version}</finalName>
</build>
</profile>
</profiles>
还有我的子pom或您不想与父项一起部署的任何模块:
<properties>
<maven.install.skip>${disable.install}</maven.install.skip>
<maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
<deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>
如此有效,当我在父pom上运行mvn deploy
时,它将编译所有模块,而不在任何东西上运行install,然后最后部署属性中没有<maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
的任何模块。因此,就我而言,仅部署父级。