首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >maven 3:访问"root“企业POM版本

maven 3:访问"root“企业POM版本
EN

Stack Overflow用户
提问于 2013-03-27 03:24:56
回答 2查看 3.7K关注 0票数 5

使用Maven 3.0.4。

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

代码语言:javascript
复制
<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继承。我们可以有一个类似如下的继承结构:

代码语言:javascript
复制
corporate-parent
  team-parent
    application-parent
      child-module

或者像这样简单:

代码语言:javascript
复制
corporate-parent
  a-simple-library

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

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

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

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

我希望我不需要写一个自定义的插件来做一些乍看起来并不困难的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-12 11:39:32

我停止使用maven-antrun-plugin,转而使用GMaven。我可以通过简单的POM层次结构遍历来获取所需的信息。

代码语言:javascript
复制
<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可以访问它。

生成的日志如下所示:

代码语言:javascript
复制
[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
票数 2
EN

Stack Overflow用户

发布于 2013-03-27 17:01:25

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

例如,该过程可以在发布者过程中被触发

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15645699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档