在Maven构建期间跳过子模块

den*_*kin 145 continuous-integration maven jenkins

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

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

有没有办法在配置文件设置中执行此操作?我已经做了一些谷歌搜索,并在这里查看其他问题/答案,并没有找到一个很好的解决方案.

我想一个选项是pom.xml完全从父项中删除该子模块,只需在我们的CI服务器上添加另一个项目来构建该模块.

建议?

Ale*_*uil 199

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

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install
Run Code Online (Sandbox Code Playgroud)

小心打击角色!是一个特殊的字符,所以你要么必须单引号(就像我做的那样)或者用反斜杠字符来转义它.

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

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install
Run Code Online (Sandbox Code Playgroud)

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

mvn -pl "!submodule1,!submodule2" install
Run Code Online (Sandbox Code Playgroud)

  • 重要提示:如果要排除嵌套子模块,则需要使用限定版本`mvn -pl!com.acme:nestedmodule1` (21认同)
  • -pl选项在artifactId之前需要'[groupId]:',因此我们应该使用mvn -pl'!:submodule-to-exclude'安装 (2认同)
  • 您也可以使用`mvn -pl'!path / to / submodule / directory'`,而无需使用groupId和artifactId。如果`submodule1`和`submodule2`位于当前目录中,我的答案有效。 (2认同)

Rag*_*ram 142

当然,这可以使用配置文件完成.您可以在父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>
 ...
Run Code Online (Sandbox Code Playgroud)

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

  • 有没有办法做到这一点,而不重复所有共享的东西? (7认同)
  • 请注意,如果您使用maven-release-plugin,它似乎不会更新隐藏在配置文件开关后面的子模块的版本号.您可以将具有不同版本号的子模块添加到项目的其余部分...... (5认同)
  • 不幸的是,在配置文件中,您不能排除先前在pom的主<modules>部分中提到的模块.JIRA https://issues.apache.org/jira/browse/MNG-5230(以及整个pom结构)可以通过更加仔细的思考完全实现. (5认同)
  • 很好的答案!我不知道为什么我从Maven文档中找到这个有很多麻烦.我要提出的一个建议是,因为我更喜欢默认运行集成测试,我将`activeByDefault`添加到该配置文件,然后必须添加另一个空配置文件(例如`skip-integration-tests`)才能够跳过它们. (4认同)
  • 哦!非常好.比我的建议简单. (2认同)
  • 这个解决方案真的有效吗?至少我无法使其正常工作。好像我有@EdRandall这样的问题 (2认同)

sku*_*uro 38

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

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]
Run Code Online (Sandbox Code Playgroud)

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

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

因此,给出以下结构:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]
Run Code Online (Sandbox Code Playgroud)

您可以指定以下命令行:

mvn -pl .,server,:client,com.mycorp.server:orm clean install
Run Code Online (Sandbox Code Playgroud)

建立一切.删除列表中的元素以仅构建您喜欢的模块.


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

  • 伟大的!我使用 `mvn install -pl .` 来仅在本地存储库中安装父 pom,而不构建模块。 (3认同)
  • 谢谢。这对我来说效果很好。另请注意,您可以添加“-am”(又名“--also-make”)来构建您指定的模块所需的项目。 (2认同)
  • 自 codehaus.org 关闭以来,MNG-5230 链接:https://issues.apache.org/jira/browse/MNG-5230 (2认同)

Spr*_*ing 9

此处给出的命令行使用答案目前不适用于较新版本的 maven(至少 3.8)您还需要添加 ' : '

mvn -pl '!:mymodule' install
Run Code Online (Sandbox Code Playgroud)