Maven 发布插件 - tagBase 被忽略

Posted

技术标签:

【中文标题】Maven 发布插件 - tagBase 被忽略【英文标题】:Maven Release Plugin - tagBase is ignored 【发布时间】:2016-08-24 21:49:09 【问题描述】:

我正在尝试使用 Maven 发布插件创建一个版本,似乎 tagBase 设置被完全忽略了。

这是我的 pom 的样子:

...
<scm>
    <developerConnection>scm:svn:http://svn.server/svn/repos/.../project/trunk</developerConnection>
</scm>
...
<build>
    ...
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>2.5.3</version>
            <configuration>
                <tagBase>http://svn.server/svn/repos/.../project/branches</tagBase>
            </configuration>
        </plugin>
    </plugins>
</build>
...

这是我正在运行的 mvn release 命令:

mvn release:prepare

我最初使用-DdryRun=true 选项进行了尝试,并注意到试运行生成的 pom.xml.tag 文件引用了.../project/tags/ 目录而不是@987654326在tagBase 中指定的@ 目录。我在没有试运行的情况下尝试了这个,结果是一样的。该版本是在我的 SVN 存储库的 tags 目录中创建的,而不是根据 pom 中的 tagBase 设置在 branches 目录中创建的。

为什么tagBase 会被忽略?如何获取 maven 发布插件以在 .../project/branches/ 而不是 .../project/tags/ 下创建发布?

编辑 - 添加一些附加信息:

我正在使用 2.5.3 版的 maven-release-plugin 和 Maven 3.3.9 版。

运行mvn release:prepare -DdryRun=true 命令后,生成的 release.propertiespom.xml.tag 文件如下所示:

release.properties

#release configuration
#Thu Aug 25 09:07:24 EDT 2016
scm.tagNameFormat=@project.artifactId-@project.version
scm.tag=project-1.0.0
project.scm.group.id\:project.tag=HEAD
pushChanges=true
scm.url=scm\:svn\:http\://svn.server/svn/repos/.../project/trunk
preparationGoals=clean verify
remoteTagging=true
projectVersionPolicyId=default
scm.commentPrefix=[maven-release-plugin] 
scm.tagBase=http\://svn.server/svn/repos/.../project/branches
project.scm.group.id\:project.developerConnection=scm\:svn\:http\://svn.server/svn/repos/.../project/trunk
project.dev.group.id\:project=1.0.1-SNAPSHOT
project.rel.group.id\:project=1.0.0
exec.snapshotReleasePluginAllowed=false
exec.additionalArguments=-P my-active-profile
completedPhase=end-release

pom.xml.tag

...
<scm>
    <developerConnection>scm:svn:http://svn.server/svn/repos/.../project/tags/project-1.0.0</developerConnection>
</scm>
...

在生成的release.properties文件中scm.tagBase属性看起来是正确的,但是pom.xml.tag中的scm信息仍然引用了tags 目录而不是 branches

【问题讨论】:

您之前是否清理过版本?可能是您正在阅读旧文件。运行mvn release:clean release:prepare -DdryRun=true,这将确保重新创建release.propertiespom.xml.tag 感谢您的建议。是的,到目前为止,我已经尝试了很多东西。在我尝试过的每个mvn release:prepare 命令之间,我一直在运行mvn release:clean,但它似乎仍然忽略了tagBase 设置。 【参考方案1】:

我开始研究maven-release-plugin 代码和maven-scm-provider-svn-commons 代码,我很确定我已经弄清楚为什么会发生这种情况。

如果tagBase 属性与SVN 存储库中branches 目录的标准命名约定匹配(例如http://svn.server/svn/repo/project/branches),则tagBase 将被忽略,而使用标准tags 目录。这是maven-scm-provider-svn-commons项目1.9.4版的相关代码:

SvnTagBranchUtils.java

public static String resolveUrl( String repositoryUrl, String tagBase, String subdir, ScmBranch branchTag )

    ...
    // User has a tagBase specified so just return the name appended to the tagBase
    if ( StringUtils.isNotEmpty( tagBase ) && !tagBase.equals( resolveTagBase( repositoryUrl ) )
        && !tagBase.equals( resolveBranchBase( repositoryUrl ) ) )
    
        return appendPath( tagBase, branchTagName );
    
    ...
    return addSuffix( appendPath( appendPath( projectRoot, subdir ), branchTagName ), queryString );

如果tagBase 与SVN 存储库布局中的标准/branches/ 目录匹配,则!tagBase.equals( resolveBranchBase( repositoryUrl) ) 条件会阻止使用它。我什至能够使用与/branches/ 目录(例如http://svn.server/svn/repo/.../project/releases)不匹配的不同 tagBase 进行测试,并且它按预期工作。

不幸的是,我仍然不能 100% 确定在运行 mvn release:prepare 时将版本写入 /branches/ 的最佳方式。我想我可能只是修改maven-scm-provider-svn-commons 中的那段代码,然后想办法让maven-release-plugin 使用我修改后的svn-commons 版本。

无论如何,我希望这可以帮助任何尝试使用 maven-release-plugin 做类似事情的人。

【讨论】:

以上是关于Maven 发布插件 - tagBase 被忽略的主要内容,如果未能解决你的问题,请参考以下文章

maven-surefire-plugin 忽略 pom.xml 中的插件顺序

带有 git 存储库的 Maven 发布插件忽略 scm.user scm.password

Cargo maven 插件 - 启动目标忽略配置,“运行”工作正常

maven install 怎么忽略spring-boot-maven-plugin

svn怎么忽略有版本控制的本地问题?

Protobuf-net / NetCore2:反序列化忽略带注释的私有字段