Java Maven版本:为每个后续版本执行覆盖第一个版本

Java Maven版本:为每个后续版本执行覆盖第一个版本,java,maven,release,Java,Maven,Release,更新我将此问题标记为关闭,因为似乎没有解决方案-插件的行为根本没有达到应有的水平,而且似乎没有人知道原因。最后,我自己编写了一个小程序来手动复制发布插件所需的行为,使用其他插件,如scm和版本。如果你想知道我是如何做到这一点的,请随时给我发电子邮件 我最近把我的项目搬到了maven。但是,我在发布过程中遇到了问题 我的释放程序如下: mvn scm:checkout -DconnectionUrl=scm:svn:https://my-server/svn/my-project/trunk -

更新我将此问题标记为关闭,因为似乎没有解决方案-插件的行为根本没有达到应有的水平,而且似乎没有人知道原因。最后,我自己编写了一个小程序来手动复制发布插件所需的行为,使用其他插件,如
scm
版本
。如果你想知道我是如何做到这一点的,请随时给我发电子邮件


我最近把我的项目搬到了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.1-SNAPSHOT
pom.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
的标记

事实上,每次我运行发布过程时,快照都会增加,但该版本会写入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>
这就是它每次都发布到
1.0.0
的原因-它签出更新的标记,但在旧的
1.0.0
标记上发布(即使
1.0.1
标记存在于目标/签出文件夹中)。为什么要这样做


更新2

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

另外,我在调查
发布日志时注意到:执行
进一步:标记
my-project-1.0.1
的签出包含
1.0.0
的标记。类似地,标记
1.0.2
的签出包含标记
1.0.0
1.0.1
等。这种行为正确吗

也许发布过程总是在它签出的任何东西的tags文件夹中查找,并使用它找到的第一个,除了第一个版本之外,每个版本的tags文件夹总是
1.0.0

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


另一个注意事项:在执行发布时,部署目标抱怨org.apache.maven.plugins:maven xxxx插件的
'build.plugins.plugin.version'丢失。
对于
maven javadoc插件
maven部署插件
maven源插件
。是否需要明确添加这些内容?

首先,您使用的版本不正确:

  • 检查最新代码(最新pom当前指向1.0.0)
  • 创建新版本1.0.1-SNAPSHOT
  • 将pom更新为指向1.0.1-SNAPSHOT并提交
  • 通常的方法是从快照版本开始(也是第一个开发步骤),因为快照表示它正在开发中,即将发布

  • 签出版本为1.0.0-SNAPSHOT的最新代码
  • 将在SVN中创建标记1.0.0并创建新的pom()
  • 创建新版本1.0.1-SNAPSHOT
  • 之后,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'...
    
    <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>
    
    签出标记的版本1.0.0并将部署site deploy()

    发布周期的下一个调用将从1.0.1-SNAPSHOT转到下一个开发周期的1.0.1版本和1.0.2-SNAPSHOT

    除上述内容外,还应使用存储库管理器,如。如果是RepoMgmt,您有一个单独的快照存储库和版本存储库,可以随时清理快照存储库。您还可以使用文件访问进行设置,该设置应按照以下正确方式进行:

    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'...
    
    <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>
    

    第一件事是,您从错误的版本开始:

  • 检查最新代码(最新pom当前指向1.0.0)
  • 创建新版本1.0.1-SNAPSHOT
  • 将pom更新为指向1.0.1-SNAPSHOT并提交
  • 通常的方法是从快照版本开始(也是第一个开发步骤),因为快照表示它正在开发中,即将发布

  • 签出版本为1.0.0-SNAPSHOT的最新代码
  • 将在SVN中创建标记1.0.0并创建新的pom()
  • 创建新版本1.0.1-SNAPSHOT
  • 之后,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'...
    
    <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>
    
    签出标记的版本1.0.0并将部署site deploy()

    发布周期的下一个调用将从1.0.1-SNAPSHOT转到下一个开发周期的1.0.1版本和1.0.2-SNAPSHOT

    除上述内容外,还应使用存储库管理器,如。如果是RepoMgmt,您有一个单独的快照存储库和版本存储库,可以随时清理快照存储库。您还可以使用文件访问进行设置,该设置应按照以下正确方式进行:

    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'...
    
    <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>
    

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

    <scm>
        <connection>scm:svn:file:///C:/var/svn/main</connection>
        <developerConnection>scm:svn:file:///C:/var/svn/main</developerConnection>
    </scm>
    
    就这些。添加<