【问题标题】:Maven: How to include ${project.version} in multi-module projectMaven:如何在多模块项目中包含 ${project.version}
【发布时间】:2014-06-09 06:50:04
【问题描述】:

我正在使用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

ProjectA/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>

core/pom.xml

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

一切都很好,直到这里意味着 core/xml 可以找到 ${project.version}。但是当我这样做时

persistence/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]

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

【问题讨论】:

    标签: java xml maven


    【解决方案1】:

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

    ProjectA/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-快照

    不要使用&lt;relativePath&gt;../../&lt;/relativePath&gt;之类的东西,这通常表明你的结构有问题。

    但是: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,因此您需要将其更改为如下内容:

    ProjectA/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 等中使用您的项目,则必须小心。除上述之外,我不建议以这种方式使用它。

    【讨论】:

    • 什么意思,不能在版本中使用属性?我从 Maven 2 开始就一直在使用它们。它们必须是本地可解析的。
    • 这看起来不错,但是 pom.xml 在部署到 nexus 时仍然保留 ${revision} 变量而不是快照(有效),这在我们使用模块作为依赖项时会产生依赖项解析错误。
    • 在这里查看我的问题stackoverflow.com/q/64958428/413032
    【解决方案2】:

    一般来说,只是不要在孩子中包含一个版本;它会继承它。如果您必须指定一个版本(Roo 因使用它不赞成的有效 POM 发脾气而臭名昭著),您可以使用该属性指定父版本或使用 ${project.parent.version} 作为子版本。另请查看versions 插件,它会立即在整个层次结构上设置版本。

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 2018-07-11
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2016-12-29
      • 2018-07-24
      相关资源
      最近更新 更多