如何使用maven获取当前的subversion版本号和URL

时间:2009-04-15 07:03:41

标签: svn maven-2 versioning

我从subversion存储库中检出一些分支或标记,然后使用maven构建项目。

现在,我想将当前版本号和URL存储到某个文件中。我怎样才能做到这一点?也就是说,我想得到我已经签出的任何分支/标签的修订号和URL。

我知道buildnumber-maven-plugin,但我认为它不会这样做。它获取在pom.xml中指定的分支的修订号。

9 个答案:

答案 0 :(得分:4)

您可以使用maven-antrun-plugin执行svnversion

<project>
  […]
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <configuration>
              <tasks>
                <exec executable="sh">
                  <arg value="-c"/>
                  <arg value="svnversion &gt;version.txt" />
                </exec>
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  […]
</project>

注意:我使用sh -c来运行svnversion,因此我可以将输出重定向到文件。我不认为你可以将输出输出到一个属性供maven构建使用。

您可以使用相同的方法来运行svn info --url

答案 1 :(得分:4)

如上所述,Maven Build Number Plugin可用于查找修订版。

至于URL:Maven Practice是使用&lt; scm&gt; -tag将其放入POM。如果你正确配置一次,然后使用适当的Maven插件(maven-scm-pluginmaven-release-plugin)进行分支,标记,发布等,你可以确定&lt; scm&gt; -tag总是包含权利网址。

答案 2 :(得分:1)

buildnumber-maven-plugin仅在您的构建中注入当前版本,因此您是对的。为了获取URL,我认为你应该编写一个使用SVNKit的maven插件。

答案 3 :(得分:1)

在我看来,API只支持'svn'命令的执行,它是各种参数和开关。问题是在subversion中,使用不同的可执行命令来检索正确的详细版本号,即'svnversion'。使用此命令,我可以判断我是否有混合版本,修改版本等。例如:

[jim@localhost sb_rc1 993]$ svn info | grep Revision
Revision: 51159
[jim@localhost sb_rc1 994]$ svnversion
51159M
[jim@localhost sb_rc1 994]$
猜猜是什么? 'svn info'在这里骗我。我的本地副本是从原来的51159修改的,这就是为什么'svnversion'报告附有M的版本号。如果我正在尝试包含混合版本的分支怎么办? 'svnversion'可以解决这个问题。 'svn info'不能。更糟糕的是,如上所示,如果我基于不良信息的发布,它将提供误导性和潜在的灾难性信息。

答案 4 :(得分:1)

user2990242公开的解决方案非常适合独立(感谢您提供了很好的解释)。 之后,您只需使用maven-jar插件(或maven-war)在manifest.mf中添加信息。 这里有一个完整的例子:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>create</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <timestampFormat>{0,date,dd-MM-yyyy HH:mm:ss}</timestampFormat>
                <doCheck>false</doCheck>
                <doUpdate>false</doUpdate>
                <providerImplementations>
                    <svn>javasvn</svn>
                </providerImplementations>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>com.google.code.maven-scm-provider-svnjava</groupId>
                    <artifactId>maven-scm-provider-svnjava</artifactId>
                    <version>2.1.1</version>
                </dependency>
                <dependency>
                    <groupId>org.tmatesoft.svnkit</groupId>
                    <artifactId>svnkit</artifactId>
                    <version>1.8.5</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                    <manifestEntries>
                        <Implementation-Build>${buildNumber}</Implementation-Build>
                        <Implementation-Title>${project.name}</Implementation-Title>
                        <Implementation-Vendor>ENTERPRISE</Implementation-Vendor>
                        <Implementation-Version>${project.version}</Implementation-Version>
                        <Built-By>${user.name}</Built-By>
                        <Built-OS>${os.name}</Built-OS>
                        <Build-Date>${timestamp}</Build-Date>
                        <SCM-Revision>${buildNumber}</SCM-Revision>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>

答案 5 :(得分:0)

您已经说过这不符合您的需求,但对于遇到类似问题的其他人而言,值得注意的是,您可以使用Maven SCM API针对{中配置的存储库调用任意SCM命令POM的{1}}部分。例如,在this answer中,我展示了如何在Maven mojo中提交单个文件。

您可以稍微修改该示例,而不是将scm向下转换为SCMProvider并调用其SvnExeScmProvider方法。这将返回info(),其中包含SvnInfoScmResult。该项封装了通过标准Subversion API运行SvnInfoItem命令的结果。

答案 6 :(得分:0)

为了完整性,antrun支持从1.7版开始将ant属性导出到mvn。见Add a new parameter to export Ant properties to Maven properties

答案 7 :(得分:0)

这是一个老问题,但buildnumber-maven-plugin现在公开了${scmBranch}值,其中包含SCM网址。我已经简单地尝试了它,它似乎工作。要在资源过滤中使用它,您必须首先将其放入属性中,就像Maven公开的timestamp值一样。

有关详细信息,请参阅http://mojo.codehaus.org/buildnumber-maven-plugin/usage.html

答案 8 :(得分:0)

当“providerImplementations”未在插件配置中进行规划时,您安装的svn客户端上的Buildernumber-maven-plugin依赖。如果未在系统路径中定义svn执行路径,或者您的svn客户端版本不匹配,则插件无法正确调用svn命令行。

因此,添加javasvn客户端及其依赖是一个好主意。

      <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.2</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>create</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <doCheck>false</doCheck>
                <doUpdate>false</doUpdate>
                <providerImplementations>
                  <svn>javasvn</svn>
                </providerImplementations>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>com.google.code.maven-scm-provider-svnjava</groupId>
                    <artifactId>maven-scm-provider-svnjava</artifactId>
                    <version>2.0</version>
                </dependency>
                <dependency>
                    <groupId>org.tmatesoft.svnkit</groupId>
                    <artifactId>svnkit</artifactId>
                    <version>1.7.8</version>
                </dependency>
            </dependencies>
        </plugin>