如何从Maven反应堆构建中排除模块?

时间:2011-04-04 13:41:17

标签: maven-2 maven

我们有一个Maven 2项目,里面有很多模块。例如:

<modules>
  <module>common</module>
  <module>foo</module>
  <module>data</module>
  <module>bar</module>
  ... more ...
</module>

假设构建“数据”模块非常耗时,我们希望在CI服务器构建项目时将其排除。目前我们使用两个pom.xml文件来实现这一目标。一个包含所有模块,另一个包含所有模块,除了可以省略CI的模块。但这很烦人,因为有时我们忘记将新模块放入两个文件中。

是否有一个不需要两个独立模块列表的解决方案?

7 个答案:

答案 0 :(得分:109)

使用Maven 3.2.1,您现在可以使用-pl !<module_name>,!<module_name>从反应堆构建中排除某些模块。

查看此功能请求:https://issues.apache.org/jira/browse/MNG-5230

答案 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>

然后您应该查看ways you can activate profiles

答案 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>的任何模块。因此,就我而言,仅部署父级。