【问题标题】:Edit: How do I set variables in a Project pom from a Maven Plugin?编辑:如何在 Maven 插件的项目 pom 中设置变量?
【发布时间】:2014-02-05 11:12:06
【问题描述】:

编辑

我能够创建一个 maven 插件,从存储库获取 url 信息并从 svn 获取信息:

@Mojo(name = "svn-info", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
@Execute(phase = LifecyclePhase.PROCESS_SOURCES)
public class SvnInfoMojo extends AbstractMojo {
    @Parameter(property="project.scm.url", defaultValue = "${project.scm.url}", required = true)
    private String url;
    private SVNInfo info;
    private Long svnLastRevision;
    private Date svnLastChangedDate;

    public void execute() throws MojoExecutionException, MojoFailureException {
        // the controller uses SVNKit to fetch the info
        SVNController controller = new SVNController(url);
        info = controller.getInfo();

        this.svnLastRevision = info.getCommittedRevision().getNumber();
        this.svnLastChangedDate = info.getCommittedDate();
    }
}

现在我的问题是:

如何在项目pom中设置变量${last-rev}${last-changed}?我尝试了以下方法:

@Parameter(property = "last-rev")
private Long svnLastRevision;

@Parameter(property = "last-changed")
private Date svnLastChangedDate;

但这不起作用,我的测试 pom 仍然显示 ${last-rev}。


我正在使用 Maven 和 Jenkins 来构建项目。我已经能够使用<properties><filtering>true</filtering> 包含来自pom 文件的属性:

application.properties

application.revision=${project.version} #uses maven's version tag.
application.revision=Rev. ${last-rev} of ${last-changed}
application.build.type=${project.buildType} #depends on the maven profile

我现在正尝试以以下格式将 SVN 修订信息插入属性文件:

application.revision=Rev. ${last-rev} of ${last-changed}

例如,这会给我Rev. 11981 of 2014-02-03 11:01:20 -0200 (Mon, 03 Fev 2014)

这是我迄今为止尝试过的:

  1. 在 Jenkins 预构建作业期间调用 shell 脚本。

    虽然这可行(使用svn infosed 命令),但它依赖于平台,这并不理想。

  2. 使用Build Number Maven Plugin

    我的问题是它给了我 SVN Revision 编号,而不是 Last Changed Rev

    另外,如果我尝试将修订版格式化为我想要的格式(使用 <format> 配置选项),它会将 ${buildNumber} 更改为内部版本并使用构建日期(例如:Rev. 1 of 2014-02-04 15:03:57 -0800 (Tue, 04 Fev 2014)) .

  3. 使用 SVNKit 创建我自己的 Maven 插件。

    为了做到这一点,我需要:

    • 从项目pom中获取scm连接;
    • 根据收到的 scm url 创建一个 SVNUrl;
    • 使用 SVNWCClient.doInfo(url, SvnRevision.HEAD);
    • 创建项目 pom 文件可用的变量(例如 ${last-rev} 和 ${last-changed}

在后一种情况下,我是 maven 插件 API 的新手。我真的不知道如何获取 Scm 组件或创建项目 pom 可用的变量。我试过使用@Component private Scm scm;,但没有用。

关于如何将 Last Changed Rev. 和 Last Changed Date 添加到我的属性文件中的任何想法?

【问题讨论】:

    标签: java maven svn jenkins maven-plugin


    【解决方案1】:
    1. 在 Jenkins 预构建作业期间调用 shell 脚本。

      虽然这可行(使用 svn info 和 sed 命令),但它是平台 依赖,这并不理想。

      此外,如果您使用svn info,您将获得 SVN 修订号,而不是 最后更改的 Rev. 除此之外还有更好的工具 获取此类信息svnversion

    2. 使用内部版本号 Maven 插件。

      我的问题是它给了我 SVN 修订号,而不是最后一个 更改版本。

      这给我的印象是你不了解 SVN 之间的区别 修订号和最后更改的版本。如果你喜欢拥有 last changed rev你要说哪个文件?通常你喜欢 有你的树干的最后一个修改版本,这正是 内部版本号 maven 插件将提供(以及 svn info 或 svnversion)。

    3. 使用 SVNKit 创建我自己的 Maven 插件。

      您将采用与 build-number-maven-plugin 相同的方式。

    您可以对 buildnumber-maven-plugin 使用以下配置来获取您应该使用的 svn 修订版:

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.2</version>
        <configuration>
          <revisionOnScmFailure>UNKNOWN</revisionOnScmFailure>
          <getRevisionOnlyOnce>true</getRevisionOnlyOnce>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>create</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    

    通过使用上述配置,您可以使用包含 SVN 修订号的${buildNumber}

    【讨论】:

    • 感谢您的回答! SVN 信息确实包含“Revision”和“Last Changed Rev”信息等。我需要项目的最后更改版本,因为修订号对应于整个存储库的全局修订号。
    • 我知道,但是要确定与 CI 系统相关的构建,全局版本就足够了。如果您在项目路径中使用提取的修订和签出,您将获得您引用的确切状态。
    • 哦,我明白了。这不是为了识别构建,而是为了……满足一些疯狂的软件规范。我正在质疑它,到目前为止无济于事。
    【解决方案2】:

    我能够解决这两个问题(获取 Last Changed Rev 并创建我的 Maven 插件)!我不需要 maven 插件,但我以后可能会派上用场(即,如果 Jenkins Subversion 插件稍后将 ${SVN_REVISION} 变量更改为存储库修订版)。

    获取最后更改的版本

    对于第一个问题,我误读了 Jenkins Subversion 插件文档。 ${SVN_REVISION} 环境变量确实返回 Last Changed Rev 编号,而不是存储库修订版本一。所以,我可以在我的 pom 中做到这一点:

    pom.xml

    <properties>
        <!-- this default revision number will be changed by Jenkins -->
        <svn.revision>REV</svn.revision>
        <!-- other properties -->
    </properties>
    

    然后,在 Jenkins build 任务中,我使用 package -Dsvn.revision=${SVN_REVISION} 调用 maven,这将更改 Maven 中的 svn.revision 参数。

    Maven 插件

    为了在我的 Maven 插件中设置参数,我使用了 MavenProject 类,它为我提供了项目 pom 属性:

    @Mojo(name = "svn-info", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
    @Execute(phase = LifecyclePhase.PROCESS_SOURCES)
    public class SvnInfoMojo extends AbstractMojo {
        @Component
        private MavenProject project;
        @Parameter(property="project.scm.url", defaultValue = "${project.scm.url}", required = true)
        private String url;
        private String svnLastRevision;
        private String svnLastChangedDate;
    
        public void execute() throws MojoExecutionException, MojoFailureException {
            SVNController controller = new SVNController(url);
            info = controller.getInfo();
    
            this.svnLastRevision = Long.toString(info.getCommittedRevision().getNumber());
            // Sets the property ${last-rev} in the project pom
            project.getProperties().setProperty("last-rev", this.svnLastRevision);
    
            // uses DateFormat to parse the date
            this.svnLastChangedDate = parseDate(info.getCommittedDate());
            // Sets the property ${last-changed} in the project pom
            project.getProperties().setProperty("last-changed", this.svnLastChangedDate);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2019-04-03
      • 2015-05-19
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 2015-05-05
      相关资源
      最近更新 更多