2

我发现了很多关于maven-release-plugin、多模块、多项目、父 POM 等的提示,但它们都不太适合我所拥有的:

我有几个项目(简化的情况是两个:project-commonproject-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 的“执行 Maven 发布”来创建我们的发布。(嗯,我们希望。这些项目直到最近才发布,所以我们的开发人员手工构建了它们,包括临时文件、未使用的文件、本地更改、XML 配置中的 LDAP 密码、编辑器.swp文件等——你可以明白为什么尽管不了解 Java™ MavenJenkins,但我的任务是改变这一点。或者也许是因为它。)

发布project-common顺利,但project-impl在第一阶段失败,检查没有 SNAPSHOT 依赖项。嗯嗯。(除了那个之外没有其他的project-common。)覆盖maven-release-plugin以跳过 SNAPSHOT 检查是不可能的。在这里使用父 POM 也不起作用,因为它们是完全独立的存储库,有时会独立发布。那么,如何在保持 Jenkins 和 Maven Release 舒适的同时做到这一点呢?

继续:回答您自己的问题 - 分享您的知识,问答式...</p>

4

1 回答 1

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}}像在 shell 中那样做吗,我问了一位同事(感谢 Umer!),他说,不是那样,而是-D覆盖属性。

这让我有点犹豫:我无法将版本放入属性中,因为 maven-release-plugin 仅更新项目<version>元素。

幸运的是,双重间接有效。虽然是一个丑陋的 hack,如果有人不使用 Jenkins 发布,或者如果有人在本地使用,它-DreleaseVersion崩溃,但有两个小改动使这些项目可以发布:

首先,我们添加一个名为的属性releaseVersion,默认为 (dynamically updated) ${project.version}

<properties>
    <releaseVersion>${project.version}</releaseVersion>
</properties>

然后,我们更改依赖项以使用它:

    <dependency>
        <groupId>de.tarent.example</groupId>
        <artifactId>project-common</artifactId>
        <version>${releaseVersion}</version>
    </dependency>

我在这个解决方案中看到的唯一另一个问题是,如果 some{one,thing} 使用来自 Maven 存储库的已发布 POM,因为它也包含此间接(我们不会在发布时过滤 POM)。但到目前为止,它运作良好。

如果需要project-impl,只需将<version>${releaseVersion}</version>线路更改为<version>1.5.1.4</version>手动,就像以前一样(其他条件不变)。

于 2015-04-10T16:30:26.250 回答