使用功能分支时避免 Maven 存储库版本冲突

2024-05-14

Question:如何处理 Maven 多项目构建的功能分支?

Jenkins 构建和部署这些分支,以将开发人员的构建开销降至最低,但开发和功能分支无法构建相同的 Maven 版本,否则我们将面临工件和源代码之间不匹配的风险。

我们有一个脚本来更改子 pom 中的父版本和根 pom 中的版本。虽然这在 Maven 空间中隔离了分支,但在合并时会导致额外的工作。

我认为 Nexus Pro 登台功能可能会帮助我们避免这种要求,并使每个功能分支使用一个特定的存储库,我们在分支删除/合并后可以轻松删除该存储库。

Again: 如何处理多分支和maven的问题?


下面的方法怎么样:

  • Use the buildnumber-maven-plugin http://www.mojohaus.org/buildnumber-maven-plugin/从 git 获取信息并填充特定的 Maven 属性(我们特别感兴趣的是scmBranch属性(即当前的git分支)
  • Use the build-helper-maven-plugin http://www.mojohaus.org/build-helper-maven-plugin/检查我们是否处于功能分支中(通过regex http://www.mojohaus.org/build-helper-maven-plugin/regex-property-mojo.html,不包括知名分支,如master, develop等)并填充(或不填充)新的 Maven 属性,例如branch.classifier
  • Use the maven-jar-plugin https://maven.apache.org/plugins/maven-jar-plugin/根据上一步设置的内容,在生成的工件上设置分类器,即使用新的branch.classifier属性:如果为空,则不会应用任何分类器(默认行为,应用于develop例如,分支);否则将动态应用以当前分支命名的分类器。

这是一个最小的例子:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>create</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.10</version>
            <executions>
                <execution>
                    <id>regex-property</id>
                    <goals>
                        <goal>regex-property</goal>
                    </goals>
                    <configuration>
                        <name>branch.classifier</name>
                        <value>${scmBranch}</value>
                        <regex>(^develop)|(^master)|(^release.*)</regex>
                        <replacement></replacement>
                        <failIfNoMatch>false</failIfNoMatch>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <classifier>${branch.classifier}</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

下面的代码片段基本上填充了scmBranch动态属性,然后设置branch.classifier仅当不同于其值时develop, master or release*,然后将其设置为分类器。

这种方法的主要优点:

  • 不会应用 pom 更改,因此根本不存在合并问题
  • Nexus 在同一版本的项目上工作但在不同的分支上不会发生冲突:分类工件将有不同的Maven坐标 https://maven.apache.org/pom.html#Maven_Coordinates,即GAV(groupId,artifactId,version)变成唯一的GAVC(+classifier)
  • That's actually a meaningful usage of the classifier https://maven.apache.org/pom.html#Dependencies attribute of an artifact:

    分类器允许区分从相同 POM 构建但内容不同的工件。

  • 生成的工件将根据其源分支在 Nexus 中动态不同,因此具有隐式可追溯性:无需开发人员干预(不易出错,隐式约定),无需 CI 作业干预(更容易维护),完全透明
  • 使用分类器,将更容易使用分支生成的工件作为 Maven 依赖项(例如,在库项目的情况下):我想使用当前正在分支 xxx 上开发的依赖项

Examples
因此,您将生成以下工件:

  • 工作时develop: e.g. project-1.0.0-SNAPSHOT.jar(空分类器,因此不应用,由正则表达式处理)
  • 工作时featureA: e.g. project-1.0.0-SNAPSHOT-featureA.jar
  • 工作时hotfix-JIRA123: e.g. project-1.0.0-hotfix-JIRA123.jar
  • 工作时release-sprint42:这取决于你,我添加这种情况是为了不应用分支名称,只是因为在这些情况下我更喜欢明确设置一个特殊的分类器,RC<number>,对于候选版本,但这是惯例/品味/习惯的问题,您也可以在此分支上应用相同的方法,只要不会在 Nexus 上产生冲突。另请注意:当使用 JIRA/Stash/Git 集成时,发布分支名称通常类似于release/v0.1.0,其中/字符可能会在某些操作系统中引起问题(如果确实需要,仍然可以通过进一步的正则表达式替换来修复)。
  • 工作时master: 嘿,没有人应该继续工作master:) 这个案例只是作为双重检查,但这实际上不是必需的

关于此方法的警告:

  • 正如下面通过注释讨论所解释的,如果相关的 Maven 项目已经使用了分类器,甚至更多地通过模块间依赖关系(例如,对来自另一个模块的测试范围类的依赖),那么应该仔细测试这种方法,因为它可能会一些缺点
  • 该书的出版<artifactId>.pom包含分支分类器的文件可能会与主线构建发生冲突(即覆盖它)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用功能分支时避免 Maven 存储库版本冲突 的相关文章

随机推荐

  • 在viewpager2中禁用动画

    我有 viewpager2 和扩展 FragmentStateAdapter 的适配器 我希望用户仅通过单击选项卡布局即可转到另一个页面 我已禁用此 viewpager2 的用户输入 但是当我单击选项卡时 有页面之间快速滑动的动画 但我只想
  • sympy 任意函数范围

    我想定义任意函数f 我知道 f 总是返回一个正数 我希望 sympy 在运行简化时能够使用这些知识 特别是简化文档中提到的三个幂规则 有没有办法做到这一点 我正在寻找类似下面的东西 f Function f positive True g
  • 如何从 shell 编译 macOS Sierra 上使用 dylib 路径的源代码

    我正在编译一些源代码 需要我已经构建的其他项目中的一些 dylib 我越来越 ld 未找到架构 x86 64 的符号 每当我执行 g some code cpp I usr local include o executable binary
  • 我什么时候应该关闭游标和数据库?

    我在自定义视图中以不同的方法多次使用相同的光标 我应该在每次使用后关闭光标还是可以保持它打开直到视图被破坏 对于数据库也是如此 是否可以在创建保存此视图的活动时打开它并在活动销毁时关闭它 当我按照上述操作时 我不断收到错误 close 从未
  • 是否有用于封闭类型名称的简短版本的 Eclipse 模板变量

    我想在 Eclipse 中为 Java 类创建一个构造函数模板 我有一个适用于大多数课程的版本 尽管它不适用于嵌套在其他类中的类 见类Inner如下 如何获得类名的简短版本 模板不起作用 public newType enclosing t
  • Jackson:无法反序列化 START_OBJECT 令牌中的 Number 实例

    我的 GWT 服务返回LinkedList
  • 为什么 FLT_MIN 等于 0?

    limits h指定非浮点数学类型的限制 例如INT MIN and INT MAX 这些值是可以使用 int 表示的最大负值和最大正值 In float h 有定义FLT MIN and FLT MAX 如果您执行以下操作 NSLog f
  • Laravel MySQL 按计数排序

    我正在使用 Laravel 和 MySQL 并且我有一个表post代表用户可以评论的帖子 现在我想按照每个帖子的评论数量按升序 降序对帖子进行排序 我该如何在 Laravel 中执行此操作 我不想添加字段post表来跟踪每个帖子的评论数量
  • 如何创建基于多个 IEnumerable 的集合

    我想要操作的类提供了类型的吸气剂IEnumerable
  • mongorestore 从独立到复制集

    我已转储在默认端口上运行的独立 mongo 数据库 14Gb 大 如下所示 mongodump username
  • 在 Inno Setup 中单击“下一步”按钮时验证自定义页面上的数据

    我已经设法获得一个基本脚本来显示向导 使用CreateInputFilePage 供用户识别我用来更新 XML 文件中某些设置的文件位置 但是 我想对所选文件的输入进行一些基本检查 而不是简单地接受用户提供的任何内容 例如 如果用户在内容无
  • 识别相似图像的库

    我想确定 2 张图像的相似程度 图像可能已被缩放 裁剪等 因此简单的像素比较将不起作用 我环顾四周 有很多关于这个主题的学术论文 但他们没有发布他们的代码 那么 您知道有一个可以比较图像的已发布库 适用于 Linux 和 Windows 吗
  • Windows 版 GitKraken 中的文件名太长

    正如建议的Q22575737 https stackoverflow com a 22575737 6623589 我已经更新了我的注册表并设置了git config system core longpaths true在处理长路径时 问题
  • 是否可以使用.NET 跟踪文件操作?

    当以某种方式调用文件操作 例如打开或关闭 时 我是否可以在操作系统继续请求之前处理它 如果可能的话可以通过以下方式取消它 NET http en wikipedia org wiki NET Framework 如果 NET没有这样的能力
  • 在 keras 中集成采样的 softmax 失败

    基于如何在 Keras 模型中使用 TensorFlow 的采样 softmax 损失函数 https stackoverflow com questions 47892380 how can i use tensorflows sampl
  • MYSQL 查询 WHERE IN 与 OR

    我开发了一个使用 OR 查询的系统 SELECT FROM tableA JOIN tableB ON idA idB WHERE idA 1 OR idA 2 OR idA 3 OR idA 4 OR idA 5 OR idA 100 与
  • 当我在控制器中使用 state.go 时,离子滑动菜单不会出现

    大家好 我正在使用 ionic 来构建我的应用程序 并且我放置了幻灯片菜单 问题是当我使用 stage go 更改视图时 此工作正常 但幻灯片菜单失败 那么我该如何解决这个问题 路由器 use strict var app angular
  • 日期/时间转换:字符串表示形式为 time_t [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何转换日期字符串 格式为 MM DD YY HH MM SS to a time tC 或 C 中的值 Use strptime 将
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 使用功能分支时避免 Maven 存储库版本冲突

    Question 如何处理 Maven 多项目构建的功能分支 Jenkins 构建和部署这些分支 以将开发人员的构建开销降至最低 但开发和功能分支无法构建相同的 Maven 版本 否则我们将面临工件和源代码之间不匹配的风险 我们有一个脚本来