maven 3 : Accessing version of "root" corporate POM

标签 maven maven-3 maven-release-plugin

使用 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}因为我不知道可能有多少级继承。我尝试定义一个 <corporate.pom.version>属性,硬编码到公司 POM 版本,但是当我发布我的公司 POM 时,发布插件不知道更新该属性(这是有道理的,它不是依赖版本,它只是一个属性,发布版本不知道更新它)。

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

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

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

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

最佳答案

我停止使用 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

关于 maven 3 : Accessing version of "root" corporate POM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15645699/

相关文章:

java - mvn release :prepare 上的 Maven 发布插件错误

java - 如何禁用 Maven 配置文件?

java - 通过 Selenium 启动浏览器时出现异常 java.lang.ClassNotFoundException : org. openqa.selenium.MutableCapability

java - LibSVM.classifyInstance(实例实例) 抛出 java.lang.NullPointerException

java - JUnit 测试继承不起作用

maven - 无法获得完整的 Maven 原型(prototype)列表

java - 在maven项目中导入外部jar而不创建依赖项

java - 如何解决补充 Maven 子模块中的循环依赖?

Maven 发布 :perform failing to even try to generate javadoc or sources

maven - 进程从 Maven 版本 :perform plugin ignores user's settings. xml 中 fork 出来?