使用 flatten-maven-plugin 简化 Maven 项目版本控制的经验

关于我们

在1C,我们开发的不仅仅是一个平台 1C:企业C ++ и JavaScript的,还有 Java 应用程序 - 特别是新的开发环境 企业开发工具 基于 Eclipse 以及与平台深度集成的消息服务器 - 交互系统.

输入

我们最常使用 Maven 作为 Java 应用程序的构建系统,在这篇短文中,我们想谈谈我们在组织开发过程中必须面对的问题之一,以及帮助我​​们克服这个问题的方法问题。

先决条件和工作流程

由于我们的 Maven 项目开发的特殊性,我们使用了相当多的模块、依赖项和子项目。 一棵树中的pom文件数量可以是几十甚至上百个。

使用 flatten-maven-plugin 简化 Maven 项目版本控制的经验

看起来:没什么大不了的,他们创建了一次就忘记了。 如果您需要一次更改或添加所有文件中的某些内容,编辑器和 IDE 中有很多方便的工具。 pom.xml 最常见的常规更改是什么? 我们认为项目版本和依赖项发生了变化。 也许有人会对此提出异议,但这正是我们的情况。 原因在于,我们在开发内核的同时,还同时开发了许多自己的库,并且为了构建和测试结果的持续可重复性,使用快照对我们来说似乎并不是一种方便的方法。 因此,有必要在每次构建时提高项目的版本号。

此外,开发人员有时需要构建自己的库分支并根据所有依赖项检查其功能,为此他必须手动更改所有依赖项的版本。

初步解决方案

由于如此频繁和多个版本更改,我希望简化 CI 内的流程并实现自动化。 这时,一个方便的、众所周知的插件就可以派上用场了。 版本-maven-插件 - 连接并启动它

mvn -N 版本:设置-DnewVersion=2.0.1

Maven 会做它应该做的一切:它将从上到下贯穿层次结构,替换所有版本 - 美! 现在剩下的就是提出 Pull Request,同事会审核更改,然后你就可以快速加入主干了。 迅速地? 不管怎样。 几百个 pom.xml 供审查,这还不包括代码。 此外,没有人能够避免与如此大量的更改文件发生合并冲突。 这里应该注意的是,在 CI 过程中,版本更改会随着功能的更改自动发生,而不是单独发生。

新功能

有一段时间,我们平静下来,辞职了,我们就这样生活,直到来自 Maven Apache 项目 从 3.5.0-beta-1 版本开始,Maven 不再支持所谓的“占位符”。 这些替代品的本质是 pom.xml 使用变量而不是项目版本的具体指示 ${修订}, ${sha1} и ${变更列表}。 这些属性本身的值可以在元素中设置 >,或者可以通过系统属性定义它们

mvn -Drevision=2.0.0 干净包

系统属性值优先于中定义的值 >.

选择优势

  4.0.0
  
    org.apache
    阿帕奇
    18
  
  org.apache.maven.ci
  ci-parent
  第一个 CI 友好型
  ${修订}${sha1}${变更列表}
  ...
  
    1.3.1
    -快照
    
  


后裔

  4.0.0
  
    org.apache.maven.ci
    ci-parent
    ${修订}${sha1}${变更列表}
  
  org.apache.maven.ci
  慈子
   ...

如果你想构建版本 2.0.0-SNAPSHOT,那么只需使用

    mvn -Drevision=2.0.0 干净包

如果您想发布,只需重置 SNAPSHOT

    mvn -Dchangelist=清理包

*以上例子取自 文章 在 Maven Apache 项目网站上

残酷的现实

一切都很好,很健康,是时候感到满足感了,但是没有。 事实证明,此方法不适用于安装和部署,因为它不会在存储库中发布的工件的描述中被替换 ${修订} 其含义和 maven 将不再理解它的全部内容。


    org.apache
    阿帕奇
    ${修订}

隧道尽头的一盏灯

我们需要寻找问题的解决方案。 本来可以挽救局面 扁平化 Maven 插件。 该插件解析了 pom 中的所有变量,但同时删除了许多其他信息,这些信息仅在组装期间需要,而在将已发布的工件导入其他项目时不需要。 该插件还“理顺”了所有父子依赖关系,因此,您会得到一个包含您需要的所有内容的平面 pom。 不便的是,它删掉了太多的“额外”,这根本不适合我们。 在研究了这个插件的开发信息后,我们发现我们并不是宇宙中唯一的人,早在 2018 年 1.1.0 月,就在插件存储库的 Github 上创建了一个拉取请求,希望使其成为可能我们自己决定如何“破坏”pom.xml。 开发人员倾听了那些受苦者的声音,并且在 XNUMX 月,随着新版本 XNUMX 的发布,一种新模式,resolveCiFriendliesOnly,出现在 flatten-maven-plugin 中,它比以往任何时候都更合适 - 它留下了pom.xml 按原样,除了元素 并允许 ${修订}, ${sha1} и ${变更列表}.

向项目添加插件


  
    org.codehaus.mojo
    扁平化 Maven 插件
    1.1.0
    
      真的
      仅解析 CiFriendlies
    
    
      
        压扁
        流程资源
        
          压扁
        
      
      
        展平.清洁
        干净的
        
          干净的
        
      
    
  

完成!

美满结局

从现在开始,为了更改整个项目的版本并让所有依赖项都知道它,我们只需要编辑该元素调整> 仅在根中 pom.xml。 这些具有相同更改的文件不是一百个或两个到达审查的,而是一个。 嗯,没必要用 版本-maven-插件.

来源: habr.com

添加评论