捕获唯一的 Maven SNAPSHOT 内部版本号
Posted
技术标签:
【中文标题】捕获唯一的 Maven SNAPSHOT 内部版本号【英文标题】:Capturing the Unique Maven SNAPSHOT build number 【发布时间】:2011-03-14 00:42:36 【问题描述】:我正在寻找一种方法来捕获在构建的“mvn deploy”阶段生成的唯一 SNAPSHOT 构建号。我希望能够将此版本(在 Hudson 构建期间)传递给另一个用于部署到应用程序服务器的进程。这里的关键是能够捕获准确的 Maven SNAPSHOT 内部版本号,例如:
foobar-0.4-20100707.060244-11.war
我注意到,如果您归档 maven 构建工件,Hudson 会捕获此信息,但尚不清楚如何公开此变量并将其传递给另一个工作(这是我想做的)。我可以在 Hudson Home 目录中看到这个变量,如下所示:
/hudson/jobs/JOB_NAME/builds/24/org.ace.widgets$foobar/archive/org.ace.widgets/foobar/0.4-20100707.060244-11
有任何 Maven 和/或 Hudson 专家知道如何公开 SNAPSHOT 内部版本号吗?哈德森在做吗?
【问题讨论】:
不知道怎么轻易暴露。以防万一, - Maven Versions Plugin 有一个versions:lock-snapshots
目标,允许将解锁的快照依赖版本解析为锁定的时间戳版本。也许你可以围绕这个建立一个解决方案。
感谢 Pascal,这是一个有趣的插件,或许可以解决我的问题。我一定会调查的。
使用快照的替代方法是让第一个 Hudson 作业在 WAR 文件的名称中包含 SVN 修订号,然后使用参数化触发器插件触发第二个作业,并使用“预定义”参数value 是内置的 $SVN_REVISION 属性。然后,第二个 Hudson 作业可以使用此值生成要从 Maven 存储库下载的 WAR 文件的名称。
【参考方案1】:
查看我的答案to this slightly different problem,我使用GMaven 在部署后访问项目元数据。它们的共同点是您必须访问唯一的内部版本号。因此,您可以调整脚本,以便在读取项目元数据后(部署后)将唯一版本存储在 maven 属性中:
pom.properties['uniqueVersion'] = uniqueVersion
如果 appserver-deploy-process 也是一个 maven 插件,请访问此属性,否则使用以下方式将其存储为文件:
new File(pom.build.directory, "uniqueVersion.txt").text = uniqueVersion
现在您可以使用 shell 脚本从 target/uniqueVersion.txt 中获取它。
【讨论】:
【参考方案2】:有点晚了,但我刚刚注意到您遇到的问题与我所面临的完全相同。我需要能够在 AIX 机器上部署在 Windows 机器上生成的任意构建工件。部署过程需要在 AIX 机器上本地运行。因此,我在 AIX 机器上定义了从服务器,它们从 Windows 机器上运行的构建作业下载构建工件。主人在 Windows 盒子上。
简而言之。构建作业归档必要的工件并使用其构建 URL 作为参数触发部署作业(它实际上是一个“运行参数”,但字符串也可以工作)。部署作业使用wget
来确定工件URL(它搜索包含某些文本的工件ID,例如不带版本的工件名称),并再次使用wget
下载工件。 wget
保存它没有版本,这样我所有的部署脚本都可以在未版本化的名称上运行。您也可以使用第一步来了解工件名称。
wget 使用远程 API(xml 版本)。如果您不想使用 wget,有一个命令行工具可以为您完成连接。
您可以通过将以下字符串附加到构建作业的运行 URL 并在您的网络浏览器中使用生成的 URL 来对其进行测试。
#to find the path (URL) of the artifact
api/xml?xpath=*/artifact[contains(fileName,"MyApp")]/relativePath/text()
#to find the path (URL) of the artifact with more than 1 string to match
#the match must identify exactly one artifact, otherwise you will
#get an error message
api/xml?xpath=*/artifact[contains(fileName,"MyApp") and contains(fileName,".ear")]/relativePath/text()
#To download the artifact
#replace $relativePath with the actual output from one of the queries above
artifact/$relativePath
【讨论】:
【参考方案3】:根据 Sean Patrick Floyds 的回答,尽管这个问题很老,但我想分享一个完整的代码示例,它将 uniqueVersion 写入 maven 属性。请记住,Maven 的内部是使用反射访问的,因此这可能会在未来的 Maven 版本中轻松分解。我针对 Maven 3.2.5 对其进行了测试。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.groovy.maven</groupId>
<artifactId>gmaven-plugin</artifactId>
<executions>
<execution>
<id>set-uniqueVersion-property</id>
<phase>deploy</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
<![CDATA[
def uniqueVersion = null;
println "Grabbing uniqueVersion...";
project.artifact.metadataList.each
if(it.class.simpleName=='ProjectArtifactMetadata')
def afi = it.class.superclass.superclass.getDeclaredField('artifact');
afi.accessible = true;
uniqueVersion = it.artifact.version;
;
project.properties['uniqueVersion'] = uniqueVersion;
println("Unique Version grabbed: $uniqueVersion");
]]>
</source>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
如果您想在其他 maven 插件中使用此属性,请确保它们的执行是在部署阶段 在 set-uniqueVersion-property 执行之后进行的。如果您希望将唯一版本写入文件,只需添加
new File(pom.build.directory, "uniqueVersion.txt").text = uniqueVersion
正如肖恩·帕特里克所说。
【讨论】:
以上是关于捕获唯一的 Maven SNAPSHOT 内部版本号的主要内容,如果未能解决你的问题,请参考以下文章