1

更新我将这个问题标记为关闭,因为似乎没有解决方案 - 插件根本没有表现出应有的行为,似乎没有人知道为什么。我最终编写了一个小程序来手动复制发布插件的所需行为,使用其他插件,例如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

一切都按预期发生,包括pom.xml更新的指向和在我的 SCM 中创建1.0.1-SNAPSHOT的标记。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.xmlnow 指向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>

下面的答案之一表明我应该创建一个单独的releasesnapshotrepo,我没有。这会导致问题吗?

请注意,我使用 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标签存在于 target/checkout 文件夹中)。为什么要这样做?


更新 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.formaven-javadoc-plugin和. 我需要明确添加这些吗?maven-deploy-pluginmaven-source-plugin

4

2 回答 2

4

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

  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 描述了详细步骤)。
  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 这样的存储库管理器,而不是文件存储库。如果是 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.
于 2013-05-16T18:04:48.347 回答
0

我遇到了完全相同的问题,结果发现问题出在 SCMconnectiondeveloperConnection配置上。我一直在使用标准的 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

<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

于 2015-07-27T14:20:20.883 回答