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

kay*_*ahr 90 maven-2 maven

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

<modules>
  <module>common</module>
  <module>foo</module>
  <module>data</module>
  <module>bar</module>
  ... more ...
</module>
Run Code Online (Sandbox Code Playgroud)

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

有没有一个解决方案不需要两个单独的模块列表?

Yog*_*h_D 131

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

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

  • 不要忘记转义shell命令行上的感叹号.它有一个非常特殊的含义,参见http://unix.stackexchange.com/questions/3747/understanding-the-exclamation-mark-in-bash (26认同)
  • @Pavel:或者只使用 `-` 而不是 `!`,即 `-pl -&lt;module_name&gt;` (6认同)
  • 不幸的是,Jenkins maven-project插件中存在一个不支持反应器模块排除的开放性问题:https://issues.jenkins-ci.org/browse/JENKINS-26472 (3认同)

SaM*_*SaM 72

最简单的可能是这样使用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>
Run Code Online (Sandbox Code Playgroud)

然后,您应该查看激活配置文件的方法

  • 模块的顺序不是它们在反应堆中出现的顺序.影响顺序的唯一方法是在模块之间创建依赖关系,即使用<dependency>标记.您不能依赖此声明顺序. (8认同)
  • @SaM实际上,从Maven 3.0.5开始,Reactor**将考虑'modules'中的顺序**,尽管依赖关系规定的顺序具有更高的优先级. (7认同)

Jör*_*ann 44

还可以在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.
Run Code Online (Sandbox Code Playgroud)

也许这个标志的组合和--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
Run Code Online (Sandbox Code Playgroud)


art*_*tol 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>
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,如果开发人员在命令行上指定了另一个配置文件,expensive-modules-to-build则不包括(除非开发人员也指定它).这使得记住需要包含哪些配置文件变得复杂.

这是一个hacky方式.始终包含两个配置文件,因为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>
Run Code Online (Sandbox Code Playgroud)


Jör*_*ann 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>
Run Code Online (Sandbox Code Playgroud)