我发现了很多关于maven-release-plugin
、多模块、多项目、父POM等的提示,但它们都不太符合我的要求:
我有几个项目(简化的情况是两个:project-common
和project-impl
),它们彼此有些分离,在单独的git存储库中开发,但通常一起发布。为此,project-common/pom.xml
包含:
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>1.5.1.4-SNAPSHOT</version>
…并且project-impl/pom.xml
包含:
<groupId>de.tarent.example</groupId>
<artifactId>project-impl</artifactId>
<version>1.5.1.4-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>${project.version}</version>
</dependency>
没有父POM。
这里的想法是通常对所有项目使用project-common
版本,但偶尔只能对一个项目进行单独发布;在这种情况下,依赖版本当然必须手动更改,但这没关系。
现在,我们使用Jenkins的"PerformMaven Release"来创建我们的版本。(好吧,我们希望如此。直到最近,这些项目都是不可发布的,所以我们的开发人员手动构建了它们,包括临时文件、未使用的文件、本地更改、XML配置中的LDAP密码、编辑器.swp
文件等。你可以理解为什么我被要求更改它,尽管我不知道Java™或Maven或Jenkins。或者可能是因为它。)
project-common
的发布进展顺利,但project-impl
在第一阶段就失败了,检查是否存在SNAPSHOT依赖关系。嗯。(除了project-common
,没有其他选项。)重写maven-release-plugin
以跳过SNAPSHOT检查是不可能的。使用父POM在这里也不起作用,因为它们是完全独立的存储库,有时还会独立发布。那么,如何在保持Jenkins和Maven Release舒适性的同时做到这一点呢?
继续:回答你自己的问题——分享你的知识,问答;A型…
通过阅读日志,我发现Jenkins调用Maven的方式如下:
mvn -B -f /var/lib/hudson/jobs/project-impl/workspace/pom.xml
-DdevelopmentVersion=1.5.1.5-SNAPSHOT -DreleaseVersion=1.5.1.4
-Dtag=1.5.1.4 -Dresume=false release:prepare release:perform
-DpreparationGoals=clean install -e
-D
一定有好处,对吧?我可以像在shell中那样做${project.version:-${releaseVersion}}
吗?我问一位同事(谢谢Umer!),他说,不是这样,但-D
覆盖了属性。
这让我停顿了一下:我无法将版本放入属性中,因为maven发布插件只更新项目<version>
元素。
值得庆幸的是,双重间接性是有效的。虽然这是一个丑陋的黑客攻击,如果有人不使用Jenkins发布,或者如果有人在本地使用-DreleaseVersion
,它将崩溃,但有两个小变化使这些项目可以发布:
首先,我们添加一个名为releaseVersion
的属性,该属性默认为(动态更新的)${project.version}
:
<properties>
<releaseVersion>${project.version}</releaseVersion>
</properties>
然后,我们将依赖项改为使用
<dependency>
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>${releaseVersion}</version>
</dependency>
我能看到的这个解决方案的唯一另一个问题是,如果某个{one,thing}使用了Maven存储库中发布的POM,因为它也包含这种间接性(我们在发布时不过滤POM)。但到目前为止,它运行良好。
如果需要project-impl
,只需手动将<version>${releaseVersion}</version>
线路更改为<version>1.5.1.4</version>
,就像以前一样(ceteris paribus)。