Maven发布:为每个后续版本执行首次发布的覆盖

时间:2013-05-16 17:30:29

标签: java maven release

更新我正在将此问题标记为已关闭,因为似乎没有解决方案 - 插件根本不应该按照应有的方式运行,并且没有人似乎知道原因。我最终编写了一个小程序来自己手动复制发布插件的所需行为,使用其他插件,如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开始,我运行上面显示的发布程序。这会将我的回购更新为以下内容(按新的升序排列):

1.0.0-SNAPSHOT
1.0.0
1.0.1-SNAPSHOT

所有内容都按预期发生,包括更新pom.xml以指向1.0.1-SNAPSHOT,并在我的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中指定的版本部署到回购中),因此我怀疑这是问题的一部分。

非常感谢您的帮助。


更新

检查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-plugin投诉maven-source-plugin。我是否需要明确添加这些?

2 个答案:

答案 0 :(得分:4)

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

  1. 检出最新代码(当前最新的pom指向1.0.0)
  2. 创建新版本1.0.1-SNAPSHOT
  3. 更新pom以指向1.0.1-SNAPSHOT并提交
  4. 通常的方法是从SNAPSHOT版本开始(也是第一个开发步骤),因为SNAPSHOT表示它正在开发中,正在发布。

    1. 使用版本1.0.0-SNAPSHOT
    2. 结帐最新代码
    3. 将在SVN中创建标签1.0.0并创建新的pom(maven-release-prepare describes the detailed steps)。
    4. 创建新版本1.0.1-SNAPSHOT
    5. 之后发布:perform将执行以下操作:

      签出标记版本1.0.0并部署site-deploy 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.
      

答案 1 :(得分:0)

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

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

相反,我应该提供trunk

的网址
<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发布模块。