我发现了很多关于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的“Perform Maven Release”来创建我们的版本。 (好吧,我们希望。这些项目直到最近都不可发布,所以我们的开发人员手工构建它们,包括临时文件,未使用的文件,本地更改,XML配置中的LDAP密码,编辑器.swp
文件等。 - 你可以看到为什么我有责任改变它,尽管不知道Java™或 Maven 或 Jenkins。或者也许,因为它。)
project-common
的发布顺利进行,但project-impl
在第一阶段失败,检查没有SNAPSHOT依赖项。嗯。 (除了project-common
之外没有。)覆盖maven-release-plugin
以跳过SNAPSHOT检查是不可能的。使用父POM也不起作用,因为这些是完全独立的存储库,有时会独立发布。那么,如何保持Jenkins和Maven Release舒适度呢?
继续:回答你自己的问题 - 分享你的知识,Q&amp; A-style ......
答案 0 :(得分:1)
阅读日志,我发现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
必须对某事有好处,对吗?我可以${project.version:-${releaseVersion}}
喜欢贝壳,我问一位同事(感谢Umer!),他说,不是那样,但是-D
会覆盖属性。
这让我措手不及:我无法将版本放入属性中,因为maven-release-plugin只更新项目<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 )。