我从subversion存储库中检出一些分支或标记,然后使用maven构建项目。
现在,我想将当前版本号和URL存储到某个文件中。我怎样才能做到这一点?也就是说,我想得到我已经签出的任何分支/标签的修订号和URL。
我知道buildnumber-maven-plugin,但我认为它不会这样做。它获取在pom.xml中指定的分支的修订号。
答案 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 >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-plugin,maven-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>