【问题标题】:maven 3: Accessing version of "root" corporate POMmaven 3:访问​​“root”公司 POM 的版本
【发布时间】:2013-03-16 18:11:13
【问题描述】:

使用 Maven 3.0.4。

我的任务是为我们的组织提供公司父 POM。我的团队将为开发人员在使用此 POM 时遇到的问题提供支持。他们通常会将构建日志附加到支持票证上。因此,我希望我的公司 POM 将公司父版本的版本与任何构建的控制台相呼应。我正在为此使用 antrun 插件。

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
  <execution>
    <id>echo-build-environment</id>
    <phase>validate</phase>
    <goals><goal>run</goal></goals>
    <configuration>
      <target>
        <echo level="info" message="Maven ${maven.version}" taskname="Version" />
        <echo level="info" message="Corporate POMs ${want.the.version.here}" taskname="Version" />
      ....
     </target>

诀窍是,我不知道公司父级和构建中使用的 POM 之间可能有多少“级别”的 POM 继承。我们可以有一个类似这样的继承结构:

corporate-parent
  team-parent
    application-parent
      child-module

或者就这么简单:

corporate-parent
  a-simple-library

我无法回显${project.version},因为那将是当前(子)项目的版本。我不能使用${project.parent.version},因为我不知道可能有多少级继承。我尝试定义一个 &lt;corporate.pom.version&gt; 属性,硬编码到公司 POM 版本,但是当我发布我的公司 POM 时,发布插件不知道更新该属性(这是有道理的,它不是依赖版本,它只是一个属性,发布版本不知道更新)。

理想情况下,我希望能够直接通过属性获取特定 POM 的版本,例如 ${some.groupId.corporate-parent.version}。有这样的东西吗?

如果没有,是否有办法在发布期间使用正在发布的项目的releaseVersion 更新 POM 属性?

我可以恢复到在每次发布之前手动编辑属性的蛮力方式。我的队友不会欣赏这种方法。

我希望我不必编写自定义插件来完成乍一看似乎并不困难的事情。

【问题讨论】:

    标签: maven maven-3 maven-release-plugin


    【解决方案1】:

    我停止使用maven-antrun-plugin 并改用GMaven。我可以通过简单的 POM 层次结构遍历获得所需的信息。

    <plugin>
        <groupId>org.codehaus.gmaven</groupId>
        <artifactId>groovy-maven-plugin</artifactId>
        <version>2.0</version>
        <executions>
            <execution>
                <id>echo-build-environment</id>
                <phase>validate</phase>
                <goals>
                    <goal>execute</goal>
                </goals>
                <configuration>
                    <source>
                    <![CDATA[
                    def rootPom = project;
                    while (rootPom.parent != null) {
                        rootPom = rootPom.parent;
                    }
    
                    project.properties.setProperty('root.pom.version', 
                                                    rootPom.version);                            
                    log.info("      Maven Home:  " + project.properties['maven.home']);
                    log.info("       Java Home:  " + project.properties['java.home']);
                    log.info("   Built By User:  " + project.properties['user.name']);
                    log.info("Corp POM Version:  " + rootPom.version);
                    ]]>
                    </source>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    project.properties.setProperty 部分存储计算的属性,以便子 POM 可以访问它。

    生成的日志如下所示:

    [INFO]       Maven Home:  c:\dev\maven\apache-maven-3.0.4
    [INFO]        Java Home:  c:\Program Files\Java\jdk1.7.0_13\jre
    [INFO]    Built By User:  user944849
    [INFO] Corp POM Version:  0.26-SNAPSHOT
    

    【讨论】:

    • 简洁的解决方案。我希望我可以用它来提供依赖版本,但看起来没有办法在依赖解决之前运行插件。将 phase 更改为 initialize 没有帮助。
    【解决方案2】:

    您可以通过使用两个插件的组合在已安装/已部署的 POM 中实现属性扩展: - maven-resources-plugin 生成过滤后的 pom.xml 版本 - maven-install-pluginmaven-deploy-plugin,使用 install-file 和 deploy-file mojos,安装/部署过滤后的 POM。

    这个过程例如可以在发布者过程中触发

    【讨论】:

    • 感谢您的想法,我将不得不探索一下。 POM 中还有许多其他属性需要在任何过滤过程中保持不变。安装和部署已经作为release:perform 的一部分进行。
    • 我对 release:prepare 的 tagNameFormat 元素中使用的@{project.version} 进行了一些探索:prepare & can't get this to work。几个问题:发布插件不过滤 &lt;properties&gt; 元素(检查源代码)并且在发布时很难过滤 POM 本身。不过谢谢!
    • 具体是如何工作的?这不是三个而不是两个插件吗?
    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2017-02-22
    • 2012-03-31
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2015-08-02
    • 2012-06-06
    相关资源
    最近更新 更多