关于我们
在1C中,我们不仅开发
C ++和
JavaScript的
1C:企业平台,而且还开发Java应用程序-特别是基于Eclipse的新
企业开发工具开发环境和与Messenger平台深度集成的服务器-Interaction
Systems 。
参赛作品
大多数情况下,我们使用maven作为组装Java应用程序的系统,在这篇简短的文章中,我们想谈谈在开发过程中必须解决的问题之一,以及可以克服这一问题的方法。
背景和工作流程
由于我们的Maven项目中开发的特殊性,我们使用了许多模块,依赖项和子项目。 一棵树中的pom文件数量可以是数十甚至数百。

看起来:没关系,一旦创建并被遗忘。 如果您需要一次更改或在所有文件中添加某些内容,则编辑器和IDE中有许多方便的工具。 什么是pom.xml最常见的常规更改? 我们认为,更改项目版本和依赖性。 也许有人想对此争论,但是我们就是这种情况。 原因是,与内核一起,我们正在同时开发许多自己的库,并且由于汇编和测试结果的可重复性,快照的使用在我们看来似乎不是一种方便的方法。 因此,有必要在每个程序集的项目中增加版本号。
另外,开发人员有时需要收集自己的库分支,并对照所有依赖项检查其性能,所有依赖项都必须手动更改版本。
初步决定
由于存在如此频繁且多次的版本更改,CI中的过程希望简化和自动化。 在这里,方便的知名
版本-maven-plugin插件可以为您提供帮助-我们将其插入并运行
mvn -N版本:set -DnewVersion = 2.0.1然后Maven会做所有应做的事情:从上到下遍历层次结构,替换所有版本-美丽! 现在仍然需要提高拉取请求,同事将注意更改,您可以快速加入后备箱。 快点 不管如何 每次评论都有数百个
pom.xml ,这还不包括代码。 此外,没有人能够避免与如此大量的已修改文件发生合并冲突。 此处应注意,在CI流程中,版本更改与功能更改一起自动发生,而不是单独发生。
新功能
有一段时间,我们平静下来,过着和平的生活,直到
Maven Apache Project中的家伙(从3.5.0-beta-1版本开始)都支持版本的所谓“占位符”(占位符)。 这些替代项的本质是在
pom.xml中使用变量
$ {revision} ,
$ {sha1}和
$ {changelist}而不是指定项目版本。 这些属性的值本身可以在<
properties >元素中设置,也可以通过系统属性来定义
mvn -Drevision = 2.0.0干净的程序包系统属性值优先于<
属性 >中定义的值。
父母
<项目>
<modelVersion> 4.0.0 </ modelVersion>
<父母>
<groupId> org.apache </ groupId>
<artifactId> apache </ artifactId>
<version> 18 </ version>
</ parent>
<groupId> org.apache.maven.ci </ groupId>
<artifactId>父级</ artifactId>
<name>首个CI友好</ name>
<version> $ {revision} $ {sha1} $ {changelist} </ version>
...
<属性>
<revision> 1.3.1 </ revision>
<changelist> -SNAPSHOT </ changelist>
<sha1 />
</ properties>
</ project>
后裔
<项目>
<modelVersion> 4.0.0 </ modelVersion>
<父母>
<groupId> org.apache.maven.ci </ groupId>
<artifactId>父级</ artifactId>
<version> $ {revision} $ {sha1} $ {changelist} </ version>
</ parent>
<groupId> org.apache.maven.ci </ groupId>
<artifactId> ci-child </ artifactId>
...
</ project>
如果要构建版本2.0.0-SNAPSHOT,则只需使用
mvn -Drevision = 2.0.0干净的程序包如果要发布,则将SNAPSHOT归零
mvn -Dchangelist =干净的程序包*以上示例摘自Maven Apache Project网站上的
一篇文章严酷的现实
一切都很好,也很健康,是时候体验一种满足感了,但是没有。 事实证明,对于安装和部署此方法将不起作用,因为
$ {revision}不会被存储库中发布的工件描述中的值所代替,并且maven无法理解其全部含义。
<父母>
<groupId> org.apache </ groupId>
<artifactId> apache </ artifactId>
<version> $ {revision} </ version>
</ parent>
隧道尽头的光
我们必须寻找解决问题的办法。 这种情况本可以通过使用一个
flatten-maven-plugin来保存的。 这个插件允许pom中的所有变量,但是同时它切出了大量其他信息,这些信息仅在组装期间需要,而在将发布的工件导入到其他项目中时则不需要。 另外,该插件“拉直”了所有父子依赖项,因此,我们得到了Flat Pom,其中包括您需要的所有内容。 不便之处在于他过多地削减了“太多”,这根本不适合我们。 在研究了有关开发此插件的信息之后,事实证明我们并不是宇宙中唯一的人,早在2018年8月,便在插件存储库中的github上创建了一个pull-request,希望能够独立确定如何“破坏” pom.xml。 开发人员听了受苦者的声音,并在12月,随着新版本1.1.0的发布,在flatten-maven-plugin中出现了一个新的resolveCiFriendliesOnly模式,就像以前从未有过的一样-它保留了pom.xml,除了
<version>元素并允许
$ {revision} ,
$ {sha1}和
$ {changelist} 。
将插件添加到项目
<插件>
<插件>
<groupId> org.codehaus.mojo </ groupId>
<artifactId> flatten-maven-plugin </ artifactId>
<version> 1.1.0 </ version>
<配置>
<updatePomFile> true </ updatePomFile>
<flattenMode> resolveCiFriendliesOnly </ flattenMode>
</ configuration>
<执行>
<执行>
<id>展平</ id>
<phase>流程资源</ phase>
<目标>
<goal>展平</ goal>
</ goals>
</ execution>
<执行>
<id> flatten.clean </ id>
<phase>干净</ phase>
<目标>
<goal>干净</ goal>
</ goals>
</ execution>
</ executions>
</ plugin>
</ plugins>
做完了!
幸福的结局
从现在开始,要更改整个项目的版本并让所有依赖项知道它,我们只需要在一个根
pom.xml中编辑<version>元素。 不会有一百或两个文件具有相同的更改才能进入审核,而是一个。 好吧,不需要使用
versions-maven-plugin 。