在Maven构建过程中跳过子模块


160

我们需要能够在某些环境中跳过子模块。

有问题的模块包含集成测试,并且需要半小时才能运行。因此,我们希望在CI服务器上进行构建时将其包括在内,但是当开发人员在本地进行构建(并运行测试)时,我们希望跳过该模块。

有没有办法通过配置文件设置来做到这一点?我已经进行了一些谷歌搜索,并在这里查看了其他问题/答案,但没有找到一个好的解决方案。

我想一个选择是从父级中pom.xml完全删除该子模块,然后在CI服务器上添加另一个项目以构建该模块。

有什么建议吗?


为什么不行Maven Way?这对我来说是完全正确的主张。
MaDa 2011年

嗯 现在我找不到人们似乎反对这个地方的地方...所以我更新了我的原始问题,以消除我声称这似乎不是“ The Maven Way”的说法。
denishaskin 2011年

Answers:


149

当然,可以使用配置文件来完成。您可以在父pom.xml中执行以下操作。

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

在您的CI中,您将使用ci配置文件运行maven ,即mvn -P ci clean install


4
很好的答案!我不知道为什么要在Maven文档中找到这个有很多麻烦。我要提出的一个建议是,由于我希望默认运行集成测试,因此我添加activeByDefault了该配置文件,然后不得不添加另一个空的配置文件(例如skip-integration-tests)以能够跳过它们。
denishaskin 2011年

7
有什么办法可以做到不复制所有共享内容?
JonnyRaa 2014年

7
当心,如果您使用的是maven-release-plugin,它似乎不会更新隐藏在配置文件开关后面的子模块的版本号。您的子模块可能具有与项目其余部分不同的版本号的子模块
Ardesco 2014年

8
不幸的是,使用配置文件时,您不能排除pom的主要<modules>部分中前面提到的模块。JIRA issue.apache.org/jira/browse/MNG-5230(以及整个pom结构)可以通过更仔细的考虑而得到更好的全面实现。
Ed Randall

2
这个解决方案真的有效吗?至少我无法使它正常工作。好像我遇到了类似@EdRandall一样的问题
Gerros

231

Maven版本3.2.1添加了这个功能,你可以使用-pl开关(快捷键--projects列表)有!-),以排除某些子模块。

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

注意bash角色!是一个特殊字符,因此您必须像我一样单引号或使用反斜杠将其转义。

排除多个模块的语法与包含相同

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

EDIT Windows似乎不喜欢单引号,但是在bash中是必须的;在Windows中,使用双引号(感谢@awilkinson)

mvn -pl "!submodule1,!submodule2" install

27
重要说明:如果要排除嵌套子模块,则需要使用限定版本mvn -pl !com.acme:nestedmodule1
LeonardBrünings2015年

3
-pl选项在artifactId之前需要'[groupId]:',因此我们应使用mvn -pl'!:submodule-to-
exclude'install

4
您也可以使用mvn -pl '!path/to/submodule/directory',而无需使用groupId和artifactId。如果submodule1submodule2位于当前目录中,我的答案将起作用。
Alexandre DuBreuil

如果-plmvn install中使用它,mvn deploy
毫无用处

39

通过指定-pl命令行参数可以决定要构建哪些反应堆项目:

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

它以下列形式之一接受逗号分隔的参数列表:

  • 包含POM的文件夹的相对路径
  • [groupId]:artifactId

因此,给出以下结构:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

您可以指定以下命令行:

mvn -pl .,server,:client,com.mycorp.server:orm clean install

建立一切。删除列表中的元素以仅构建所需的模块。


编辑:正如blackbuild所指出的那样,从Maven 3.2.1开始,您有一个新-el标志将反应堆中的项目排除在外,类似于 -pl


2
谢谢。这对我来说很好。还要注意,您可以添加“ -am”(也称为“ --also-make”)来构建指定模块所需的项目。
GaZ 2013年

1
大!我用来mvn install -pl .仅在本地回购中安装父pom而不构建模块。
Marcin

另外,请访问jira.codehaus.org/browse/MNG-5230。现在,您可以从反应堆中排除项目。
blackbuild

1
自codehaus.org关闭以来的MNG-5230链接:issue.apache.org/jira/browse/MNG-5230
Ed Randall

不幸的是,它不能暂时运行,即,如果我有top / mod1 / mod2并从顶部构建,则-pl'!mod2'会引发错误。
zakmck

4

多模块项目的概念可以满足项目中相互依赖的部分的需求。这样的客户端取决于服务,而服务又取决于EJB或数据访问例程。您可以通过这种方式对持续集成(CI)测试进行分组。通过说CI测试需要与应用程序逻辑更改保持同步,我可以将其合理化。

假设您的项目的结构为:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

project-root/pom.xml定义模块

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

ci/pom.xml定义配置文件,例如:

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

这将导致Maven跳过此模块中的测试,除非命名的配置文件CI处于活动状态。必须指示CI服务器执行mvn clean package -P CI。Maven网站对配置机制进行了深入的说明


2

现在(从1.1.1版本开始)在pit中有一个“ skip”标志。

因此,您可以执行以下操作:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

在您的模块中,坑将跳过

[INFO] --- pitest-maven:1.1.3:mutationCoverage(default-cli)@ module-selenium --- [INFO]跳过项目

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.