Maven:如何在多模块项目中包含$ {project.version}

时间:2014-04-24 06:18:28

标签: java xml maven

我正在使用maven 3.2.1

 mvn -version
Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T09:37:52-08:00)
Maven home: /usr/local/Cellar/maven/3.2.1/libexec
Java version: 1.7.0_55, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.2", arch: "x86_64", family: "mac"

我的模块结构

projectA/
        pom.xml
        core/
             pom.xml
             business/
                     pom.xml
             persistence/
                     pom.xml
             rest/
                     pom.xml
       federated_services/
                     pom.xml

项目A / pom.xml的

    <groupId>com.org</groupId>
    <artifactId>projectA</artifactId>
    <packaging>pom</packaging>
    <version>${global.version}</version>
    <properties>
        <global.version>1.0-SNAPSHOT</global.version>
    </properties>

芯/ pom.xml的

<parent>
    <artifactId>projectA</artifactId>
    <groupId>com.org</groupId>
    <version>${global.version}</version>
    <relativePath>..</relativePath>
</parent>

在此之前一切正常,这意味着 core / xml 可以找到${project.version}。但是当我做的时候

持久性/ pom.xml的

   <parent>
        <artifactId>core</artifactId>
        <groupId>com.org</groupId>
        <version>${global.version}</version>
        <relativePath>../../</relativePath>
    </parent>

pom抱怨

[ERROR]   The project com.org:persistence:${global.version} (/Users/harith/IdeaProjects/project/core/persistence/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM: Could not transfer artifact com.org:core:pom:${global.version} from/to local central mirror (http://maven.corp.org.com:9999/repository/public): Illegal character in path at index 68: http://maven.corp.org.com:9999/repository/public/com/org/core/${global.version}/core-${global.version}.pom and 'parent.relativePath' points at wrong local POM @ line 5, column 13 -> [Help 2]

问题
- 如何从 projectA / pom.xml 继承 persistence / pom.xml 继承${project.version}

2 个答案:

答案 0 :(得分:5)

一般来说,不要在孩子身上加一个版本;它会继承它。如果你必须指定一个版本(Roo因发布具有有效POM的发脾气而臭名昭着而且它不赞同),你既可以指定带有属性的父版本,也可以使用${project.parent.version}作为孩子的版本。版本。另请查看versions插件,它将立即在整个层次结构上设置版本。

答案 1 :(得分:1)

首先,您不能在版本中使用属性:

项目A / pom.xml的

  <groupId>com.org</groupId>
  <artifactId>projectA</artifactId>
  <packaging>pom</packaging>
  <version>1.0.0-SNAPSHOT</version>

其次,你不应该在孩子身上使用相对路径: 芯/ pom.xml的

<parent>
  <artifactId>projectA</artifactId>
  <groupId>com.org</groupId>
  <version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>core</artifactId>

如果你有一个persistence / pom.xml

,这就说明了这一点

        核心         com.org         1.0.0-SNAPSHOT     

完成使用像<relativePath>../../</relativePath>这样的事情,这通常表明你的结构是错误的。

但是:Starting with Maven 3.2.1 you can use special properties来定义您喜欢的版本。 The following placeholders are allowed in versions:

${revision}, ${changelist}, and ${sha1}

这意味着如果您愿意,可以使用它们,但只能使用Maven 3.2.1,因此您需要将其更改为以下内容:

项目A / pom.xml的

  <groupId>com.org</groupId>
  <artifactId>projectA</artifactId>
  <packaging>pom</packaging>
  <version>${revision}</version>

并在核心:

<parent>
  <artifactId>projectA</artifactId>
  <groupId>com.org</groupId>
  <version>${revision}</version>
</parent>
<artifactId>core</artifactId>

但这意味着您需要每次都像这样调用maven:

mvn -Drevision=1.0.0-SNAPSHOT clean package

哪个会奏效。如果你在Eclipse等中使用你的项目,你必须要小心。除了上述之外,我不建议以这种方式使用它。