maven - 为多模块 Maven 项目合并 Git 流修补程序的最佳工具

标签 maven merge git-flow

假设我的开发分支在 v 1.0.1-SNAPSHOT 上,我的主人在 1.0.0 上。
我必须创建一个修补程序。使用 SourceTree 的 Git Flow 菜单(或任何其他工具),我从 master 创建修补程序分支,将 poms 更新到 v 1.0.0.1(使用 mvn 版本:set -DnewVersion=1.0.0.1),然后进行修复。

当我使用 Git-Flow 完成修补程序时,我必须合并回开发分支。这意味着 pom 文件会发生冲突。如果我有一个带有大型模块树的多模块项目,则必须解析所有 pom。在两个分支中更改的其他文件也会发生冲突。

考虑到在修复期间对 pom 没有任何更改,只需使用开发分支上的版本即可解决它们。

这必须为每个修补程序完成,但例如使用 SourceTree,在视觉上很难区分 pom 和其他冲突文件。如果我能以某种方式分离这些文件,我可以通过接受开发分支上已有的内容来安全地忽略和合并这些文件,那就太好了。

最好的方法是什么?

最佳答案

我知道的最简单的解决方案是使用版本的属性而不是文字将它们定义到 pom 文件中。这从 Maven 3.5.0 开始可用.

你可以这样做:

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
</project>

现在您可以通过以下方式构建它:
mvn -Drevision=1.2.0-SNAPSHOT clean package

但这意味着每次通过命令行调用 Maven 时都要定义修订版,这有点麻烦。因此,您可以通过 .mvn/maven.config 使用该解决方案文件包含:

-版本=1.2.0-快照

您可以像这样在 Maven pom 本身中定义属性:

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
</project>

这意味着您只有一个定义版本的位置,而不是在每个模块等中。

多模块设置也可以这样工作,其中父级的子级可能如下所示:
<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

但请注意,您必须使用 flatten-maven-plugin如果您喜欢 deploy such artifacts to a repository或者只是想做 mvn install .这需要看起来像这样:
<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>

 <build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>flatten-maven-plugin</artifactId>
      <version>1.0.0</version>
      <configuration>
        <updatePomFile>true</updatePomFile>
      </configuration>
      <executions>
        <execution>
          <id>flatten</id>
          <phase>process-resources</phase>
          <goals>
            <goal>flatten</goal>
          </goals>
        </execution>
        <execution>
          <id>flatten.clean</id>
          <phase>clean</phase>
          <goals>
            <goal>clean</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
  </build>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

这意味着最终您只有一行正在定义项目的版本,这应该会大大减少这种合并问题。

请仔细阅读文档!

请仅使用 ${revision} , ${changelist}${sha1}目前不支持其他属性。

关于maven - 为多模块 Maven 项目合并 Git 流修补程序的最佳工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44587798/

相关文章:

Git功能分支审查: Rewrite or add commit?

java - 通过maven命令设置config.properties值

arrays - 如何将数组的每个元素压缩到 ruby​​ 中另一个数组的每个元素?

Git:有没有一种从一个分支 merge 到多个分支比串行执行每个分支更快的方法?

java - 持续集成——git flow

git - 发布分支的 Azure devops merge 类型

macos - playn 不玩 mvn,具有讽刺意味的是

java - bundle jre 中缺少 "ext"文件夹

java - Surefire 和 OpenClover - 如果测试失败生成 Clover 报告

python - 合并列表列失败