为什么Maven版本插件(版本:使用最新版本)不更新/更改-SNAPSHOT版本以发布(无-SNAPSHOT版本)



我使用版本Maven插件插件使用最新版本功能将groupID=com.example*内部依赖版本更新为最新版本。这是作为我们使用Jenkins的CI系统的一部分执行的。

当开发人员开始处理一个新功能时,他们会将代码分支,处理分支,当新功能实现(或部分实现)时,代码会合并回trunk(通常一周多次)。

分支机构版本更新:

  • 使用"快照"配置文件。请参阅以下pom.xml快照配置文件配置和Artifactory repo配置
  • 用于更新版本的命令:mvn -P snapshot -B versions:use-latest-versions versions:update-properties -Dincludes=com.example* -DexcludeReactor=false -DallowSnapshots=true ...

中继版本更新:

  • 使用"生产"配置文件。请参阅以下pom.xml生产配置文件配置和Artifactory配置
  • 用于更新版本的命令:mvn -P production -B versions:use-latest-versions versions:update-properties -Dincludes=com.example* -DexcludeReactor=false ...

有时分支构建会将com.example*依赖关系版本更新为"…-SNAPSHOT"版本(这是正常的,因为libs快照Artifactory repo被用作依赖关系存储库,它可以具有-SNAPSHOT依赖关系版本)。这些版本更新被检查回源代码管理(svn)。

当代码(包括pom.xml版本更新更改)从分支合并回trunk并执行trunk构建时,所有com.example*内部依赖关系版本都应更改/更新为最新发布版本。但由于某些原因,当依赖版本中包含"-SNAPSHOT"时版本:使用最新版本不会将版本更改/更新为最新版本(无-SNAPSHOT)。


示例:

人工回购有流动版本:

  • libs快照有"com.example:myLib:1.1.10-snapshot","com.example:myLib:11.1.11-snapshot"
  • libs版本有"com.example:myLib:1.1.9","com.example:myLib:1.1.12"

构建myApp分支将从libs快照和更新com中获得依赖版本。例如:myLib版本到1.1.11-snapshot,并将此更新检查回SVN

...    
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>myLib</artifactId>
        <version>1.1.11-SNAPSHOT</version>
    </dependency>
...

将包含上述依赖版本更改的代码合并回trunk并运行trunk构建(包括版本更新)mvn -P production -B versions:use-latest-versions...不会更改com。示例:myLib版本为1.1.12


人工配置:

  • 本地repos:libs快照本地(开发存储库);libs发行版本地(发行库)
  • 虚拟转发:libs快照(包括libs快照本地、libs发布本地和远程转发);libs发行版(包括本地和远程repos)

pom.xml配置:

...
<profiles>
    <profile>
        <id>snapshot</id>
        <distributionManagement>
            <repository>
                <id>libs-snapshot-local</id>
                <name>Internal Applications Snapshot Repository</name>
                <url>http://example.com/artifactory/libs-snapshot-local</url>
            </repository>
        </distributionManagement>
        <repositories>
            <repository>
                <snapshots>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                </snapshots>
                <id>libs-snapshot</id>
                <name>libs-snapshot</name>
                <url>http://example.com/artifactory/libs-snapshot</url>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                </releases>
            </repository>
            <repository>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
                <id>libs-release</id>
                <name>libs-release</name>
                <url>http://example.com/artifactory/libs-release</url>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                </releases>
            </repository>
        </repositories>
        <build>
            ...
        </build>
    </profile>
    <profile>
        <id>production</id>
        <distributionManagement>
            <repository>
                <id>libs-release-local</id>
                <name>Internal Applications Snapshot Repository</name>
                <!-- Artifacts are promoted to libs-release-local not deployed directly -->
                <url>http://example.com/artifactory/libs-snapshot-local</url>
            </repository>
        </distributionManagement>
        <repositories>
            <repository>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
                <id>libs-release</id>
                <name>libs-release</name>
                <url>http://example.com/artifactory/libs-release</url>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                </releases>
            </repository>
        </repositories>
        <build>
            ...
        </build>
    </profile>
</profiles>

您应该确保使用的是最新版本的插件(2.3)。我相信2.3修复了一些问题(也就是说,它仍然是一个非常有缺陷的插件)。

我发现版本插件的另一个问题是与其他版本目标甚至其他maven目标相结合。不要那样做。例如,您上面的代码同时运行versions:use-latest-versions versions:update-properties。相反,为每个目标执行一次mvn。是的,这是一个痛苦的过程,并减缓了构建过程,但我发现它要可靠得多,特别是如果您使用版本:updateparent(2.3可能已经修复了这些问题)。

我还认为excludeReactor一般都坏了。如果你在聚合项目上运行版本更新,我不建议你这样做。相反,转到每个子模块并运行命令。

您必须执行两个步骤:

  1. mvn versions:use-releases(这将把所有SNAPSHOT更改为发布版本)
  2. mvn versions:use-latest-release(这将把当前发布版本更改为最新的可用发布版本)

我认为文件中有一个错误。

http://www.mojohaus.org/versions-maven-plugin/examples/advancing-dependency-versions.html

文件:

versions:use-latest-releases在pom中搜索所有更新版本的非SNAPSHOT版本,并将其替换为最新版本。

与下面的目标矩阵冲突。

最新更新