【问题标题】:Maven release:perform overwriting first ever release for every subsequent releaseMaven 版本:为每个后续版本执行覆盖第一个版本
【发布时间】:2013-05-11 17:21:40
【问题描述】:

更新我将这个问题标记为关闭,因为似乎没有解决方案 - 插件根本没有表现出应有的行为,似乎没有人知道为什么。我最终编写了一个小程序来手动复制发布插件的所需行为,使用其他插件,如scmversions。如果您想了解我是如何做到这一点的,请随时给我发电子邮件。


我最近将我的项目转移到了 maven。但是,我在发布过程中遇到了问题。

我的发布流程如下:

mvn scm:checkout -DconnectionUrl=scm:svn:https://my-server/svn/my-project/trunk -DcheckoutDirectory=my-project
cd my-project
mvn --batch-mode release:prepare
mvn release:perform

我从1.0.0-SNAPSHOT 开始,我运行上面显示的发布过程。这会将我的 repo 更新为以下内容(按新度升序排列):

1.0.0-SNAPSHOT
1.0.0
1.0.1-SNAPSHOT

一切都按预期进行,包括更新为指向1.0.1-SNAPSHOTpom.xml 和在我的SCM 中创建的名为my-project-1.0.0 的标记。但是,当我再次运行该过程时,我的仓库中会出现以下内容:

1.0.0-SNAPSHOT
1.0.1-SNAPSHOT
1.0.0
1.0.2-SNAPSHOT

也就是说,永远不会创建 1.0.1 版本,而是将 1.0.1-SNAPSHOT 发布到 1.0.0。请注意,所有其他方面都按预期运行 - pom.xml 现在指向 1.0.2-SNAPSHOT,并且在我的 SCM 中创建了一个名为 my-project-1.0.1 的标签。

事实上,每次我运行发布过程时,SNAPSHOT 都会增加,但发布会写入 1.0.0,而从未创建过新发布。例如,再运行 3 次发布过程会导致以下结果:

1.0.0-SNAPSHOT
1.0.1-SNAPSHOT
1.0.2-SNAPSHOT
1.0.3-SNAPSHOT
1.0.4-SNAPSHOT
1.0.0
1.0.5-SNAPSHOT

上述的预期行为是:

1.0.0-SNAPSHOT
1.0.0
1.0.1-SNAPSHOT
1.0.1
1.0.2-SNAPSHOT
1.0.2
1.0.3-SNAPSHOT
1.0.3
1.0.4-SNAPSHOT
1.0.4
1.0.5-SNAPSHOT

第一个版本的pom.xml 如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" x mlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>my-project</artifactId>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>my-project</name>

<distributionManagement>
    <repository>
        <id>my-server</id>
        <url>file://\\my-server\repo\</url>
    </repository>
</distributionManagement>

<scm>
    <developerConnection>scm:svn:https://my-server/svn/my-project</developerConnection>
</scm>

<build>
    <plugins>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>2.4.1</version>
        </plugin>       

    </plugins>


</build>

<repositories>
    <repository>
        <id>my-server</id>
        <url>file://\\my-server\repo\</url>
    </repository>
</repositories>

</project>

以下答案之一建议我应该创建一个单独的 releasesnapshot 存储库,但我没有。这会导致问题吗?

请注意,每当提交代码时,我使用 Jenkins 自动调用 mvn deploy。然而,这完全符合预期(即将提交的pom.xml 中指定的任何版本部署到 repo)所以我怀疑这是问题的一部分。

非常感谢您的帮助。


更新

检查mvn release:perform 命令的输出,我看到以下内容:

Checking out the project to perform the release ...
Executing: cmd.exe /X /C "svn --non-interactive checkout https://my-server/svn/my-project/tags/my-project-1.0.2 c:\localrelease\mvn\my-project\target\checkout"
Working directory: c:\localrelease\mvn\my-project\target
Invoking perform goals in directory c:\localrelease\mvn\my-project\target\checkout\tags\my-project-1.0.0\trunk
Executing goals 'deploy'...

它每次都发布到1.0.0 是有原因的——它检查更新的标签,但在旧的1.0.0 标签上发布(即使1.0.1 标签存在于目标/结帐文件夹中)。为什么要这样做?


更新 2

我已拆分为 2 个单独的存储库(一个用于快照,一个用于目标),但此问题仍然存在。

此外,在进一步调查release:perform 的日志时,我注意到了一点:标签my-project-1.0.1 的结帐包含1.0.0 的标签。同样,标签1.0.2 的结帐包含标签1.0.01.0.1 等。这是正确的行为吗?

也许发布过程总是在标签文件夹中查找它检出的任何内容并使用它找到的第一个,对于每个版本,它总是1.0.0除了第一个版本。

这似乎是一个非常奇怪的解释,但它是迄今为止我所看到的行为的唯一解释。现在的问题是,我在pom.xml 中错误地配置了什么导致这种情况发生?

另一个注意事项:在执行发布时,部署目标会抱怨 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-xxxx-plugin is missing. 对应于 maven-javadoc-pluginmaven-deploy-pluginmaven-source-plugin。我需要明确添加这些吗?

【问题讨论】:

    标签: java maven release


    【解决方案1】:

    首先是你从错误的版本开始:

    1. 查看最新代码(最新的 pom 当前指向 1.0.0)
    2. 创建新版本 1.0.1-SNAPSHOT
    3. 更新 pom 以指向 1.0.1-SNAPSHOT 并提交它

    通常的方法是从 SNAPSHOT 版本开始(也是第一个开发步骤),因为 SNAPSHOT 表明它正在开发中,即将发布。

    1. 使用版本 1.0.0-SNAPSHOT 签出最新代码
    2. 将在 SVN 中创建标签 1.0.0 并创建新的 pom (maven-release-prepare describes the detailed steps)。
    3. 创建新版本 1.0.1-SNAPSHOT

    在 release:perform 之后会执行以下操作:

    签出标记版本 1.0.0 并将部署站点部署 (maven-release-perform)

    发布周期的下一个调用将从 1.0.1-SNAPSHOT 转到 1.0.1 发布,并在下一个开发周期中使用 1.0.2-SNAPSHOT。

    除了上述之外,您还应该使用像 Artifactory, Nexus, Archiva instead of a file repository 这样的存储库管理器。如果是 RepoMgmt,您有一个单独的 SNAPSHOT 存储库和版本,可以不时清理 SNAPSHOT 存储库。您还可以使用文件访问进行设置,这应该以正确的方式完成,如下所示:

    <distributionManagement>
        <repository>
          <id>releases</id>
          <url>file:///C:/maven/releases</url>
        </repository>
        <snapshotRepository>
          <id>snapshots</id>
          <url>file:///C:/maven/snapshots</url>
        </snapshotRepository>
        <site>
          <id>site</id>
          <url>file:///C:/maven/sites/${project.groupId}/${project.artifactId}/${project.version}</url>
        </site>
    </distributionManagement>
    

    此外,如果您制作单独的 SNAPSHOT 和发布存储库,则元数据文件在发布存储库和 SNAPSHOT 存储库中看起来会有所不同。

    默认的发布周期是从一个发布的 SNAPSHOT 到下一个 SNAPSHOT,如下所示:

    1. Cycle
    1.0.2-SNAPSHOT
    1.0.2
    1.0.3-SNAPSHOT
    
    2. Cycle
    1.0.3-SNAPSHOT
    1.0.3
    1.0.4-SNAPSHOT
    
    3. Cycle
    1.0.4-SNAPSHOT
    1.0.4
    1.0.5-SNAPSHOT
    
    and so forth.
    

    【讨论】:

    • 感谢您的回复。我可能在我的问题中解释得不好,但我确实理解应该发生的循环。可能是由于设置不正确(我今天将从一张干净的纸上进行测试),但问题似乎是release:perform 总是写入 1.0.1。目前我在 1.0.7-SNAPSHOT;当我运行发布过程时,它会移动到 1.0.8-SNAPSHOT,但随后会“发布”到 1.0.1,而不是 1.0.7。每次我运行release:perform 时,它都会覆盖第一个版本。初始回购设置中的某些错误是否会导致此问题?
    • 我再次尝试了一个全新的项目(尽管仍然只有一个存储库),但同样的问题再次发生。从1.0.0-SNAPSHOT 开始,我运行发布过程,1.0.0 被发布到 repo,标签 my-project-1.0.0 添加到 SCM,1.0.1-SNAPSHOT 在 repo 中创建(并且 poms 更新)。当我再次运行发布过程时,标签my-project-1.0.1 被添加到SCM,1.0.2-SNAPSHOT 被添加到repo 但发布1.0.1 从未出现在repo 中 - 而是1.0.0 被覆盖。任何想法是什么原因造成的?单一存储库是问题吗?
    • 这不可能。您能否将完整的项目推送到 Github 或在 github 上提供一个要点,以便我看一下。
    • 非常感谢您的帮助 :)。您需要查看哪些文件?除了编辑过的pom.xml 之外,我没有更改该项目的任何内容,该项目是使用mvn archetype:generate -DgroupId=com.foo -DartifactId=my-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 创建的。我还应该提到,在每次 SCM 提交时,Jenkins 都会调用 mvn deploy - 但是,这会正确更新当前快照(即在提交的 pom.xml 中指定的快照),所以如果这是导致问题的原因,我会感到惊讶。
    • 我已经更新了问题并在底部添加了一些内容。这可能是相关的?谢谢
    【解决方案2】:

    我遇到了完全相同的问题,结果发现问题出在 SCM connectiondeveloperConnection 配置上。我一直在使用标准的 SVN 布局(tunk、branch、tags),但我已经提供了我的 repo 的根目录的 URL:

    <scm>
        <connection>scm:svn:file:///C:/var/svn/main</connection>
        <developerConnection>scm:svn:file:///C:/var/svn/main</developerConnection>
    </scm>
    

    相反,我应该提供 trunk 的 URL

    <scm>
        <connection>scm:svn:file:///C:/var/svn/main/trunk</connection>
        <developerConnection>scm:svn:file:///C:/var/svn/main/trunk</developerConnection>
    </scm>
    

    就是这样。添加/trunk导致maven-release-plugin根据当前project.version发布我的模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-20
      • 2013-06-20
      • 2017-09-20
      • 2019-02-07
      • 2017-07-27
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      相关资源
      最近更新 更多