Maven: Как включить $ {project.version} в многомодульный проект

1

Я использую 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>

ядро /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>

Жум жалуется

[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]

Вопрос
- Как я могу персистировать/pom.xml наследовать ${project.version} от projectA/pom.xml?

Теги:
maven

2 ответа

4

Вообще говоря, просто не включайте версию в ребенка; он наследует его. Если вам нужно указать версию (Roo, как известно, бросает истерику с действительными POM, которые она не одобряет), вы можете указать родительскую версию с этим свойством или использовать ${project.parent.version} для дочерней версии. Также посмотрите на плагин versions, который сразу установит версию на всю иерархию.

1

Во-первых, вы вообще не можете использовать свойства в версиях:

ProjectA/pom.xml

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

Во-вторых, вам не нужно использовать относительный путь в ваших дочерних элементах: core/pom.xml

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

Это приводит меня к сути, если у вас есть persistence/pom.xml

core com.org 1.0.0-SNAPSHOT

Готово использовать такие вещи, как <relativePath>../../</relativePath> это обычно показатель того, что ваша структура неверна.

НО: Начиная с Maven 3.2.1 вы можете использовать специальные свойства для определения нужных вам версий. В версиях допускаются следующие заполнители:

${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 и т.д. Помимо вышеизложенного я не могу рекомендовать его использовать таким образом.

  • 0
    Что вы имеете в виду, вы не можете использовать свойства в версиях? Я использую их с Maven 2. Они просто должны быть локально разрешимыми.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню