捕获唯一的 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 内部版本号的主要内容,如果未能解决你的问题,请参考以下文章

Maven中的SNAPSHOT版本和正式版本理解

理解Maven中的SNAPSHOT版本和正式版本

关于maven中的快照版本(snapshot)与正式版本(release)解析。

版本号中Snapshot的含义

maven中snapshot版本和正式版本的区别

maven中的snapshot来源与注意事项