编辑:如何从Maven插件中设置Project pom中的变量?

时间:2014-02-05 11:12:06

标签: java maven svn jenkins maven-plugin

修改

我能够创建一个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 修订版号,而不是 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网址创建SVNUrl;
    • 使用SVNWCClient.doInfo(url,SvnRevision.HEAD);
    • 创建项目pom文件可用的变量(例如$ {last-rev}和$ {last-changed}
  4. 在后一种情况下,我是maven插件API的新手。我真的不知道如何获取Scm组件或创建项目pom可用的变量。我已尝试使用@Component private Scm scm;,但这不起作用。

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

2 个答案:

答案 0 :(得分:0)

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

      

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

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

  2. 使用Build Number Maven插件。

      

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

    这给我的印象是你不理解SVN之间的差异 修订号和最后更改的转速。如果你想拥有 last changed rev您必须说明哪个文件?通常你喜欢 有最后一次更改你的主干的修改,这正是 内置编号maven插件将提供(以及svn info或svnversion)。

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

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

  4. 您可以使用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}

答案 1 :(得分:0)

我能够解决这两个问题(获得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 构建任务中,我使用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);
    }
}