Maven Release Plugin - tagBase被忽略

时间:2016-08-24 21:49:10

标签: maven maven-release-plugin

我尝试使用Maven Release Plugin创建一个版本,似乎完全忽略了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发布命令:

mvn release:prepare

我最初使用-DdryRun=true选项尝试了此操作,并注意到干运行生成的 pom.xml.tag 文件引用了.../project/tags/目录在.../projects/branches/中指定的tagBase目录。我没有干跑就试过了,结果是一样的。该版本是在我的SVN存储库中的标记目录中创建的,而不是根据pom中的tagBase设置在分支目录中创建的。

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

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

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

运行mvn release:prepare -DdryRun=true命令后,生成的 release.properties pom.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信息仍然引用了标记目录而不是分支

1 个答案:

答案 0 :(得分: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.equals( resolveBranchBase( repositoryUrl) )条件阻止tagBase与SVN存储库布局中的标准/branches/目录匹配时使用/branches/。我甚至能够使用与http://svn.server/svn/repo/.../project/releases目录不匹配的不同tagBases(例如,/branches/)来测试它,并且它按预期工作。

不幸的是,我仍然不能100%确定在运行mvn release:prepare时将版本写入maven-scm-provider-svn-commons的最佳方法。我想我可能只是修改maven-release-plugin中的那段代码,并想办法让svn-commons使用我修改后的版本SELECT time, value1, '' as value2 from A UNION ALL SELECT time, '' as value1, value2 FROM B

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