Не удалось разрешить ${project.version} в дочернем pom.xml из родительского pom.xml

У меня есть иерархия проекта как:

A - pom.xml
|__ B - pom.xml
    |__ C - pom.xml

Недвижимость project.version определяется в pom.xml, определенном в A. Другие два pom определяют родительский тег и соответствующий относительный путь к соответствующему родительскому pom.

<parent>
        <groupId>com.GRP.id</groupId>
        <artifactId>ARTIFACT_ID</artifactId>
        <version>${project.version}</version>
        <relativePath>../pom.xml</relativePath>
</parent>

Проблема в том, что maven не может разрешить ${project.version} и использует его как есть. Это вызывает следующее исключение при выполнении из A/B/C:

[ERROR] The build could not read 1 project -> [Help 1]
org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for com.project_name.module_name:sub_module_name:[unknown-version]: Could not transfer artifact com.project_name.module_name:module_name:pom:${project.version} from
to env-module_name-all-repos (REPO_URL): Illegal character in path at index 96: https://DEMO
/artifactory/env-module_name-all-repos/com/project_name/module_name/module_name/${project.version}/module_name-${project.version}.pom and 'parent.relativePath' points at wrong
local POM @ com.project_name.module_name:sub_module_name:[unknown-version], C:\WorkSpaces\Repository\sub_module_name\pom.xml, line 10, column 10

Любое предложение о том, как получить доступ к тому же из дочерних POM.

3 ответа

Решение

@Sumit,

Мавен осматривает <parent> блок и его содержимое groupId, artifactId, а также version до собственного проекта groupId, artifactId а также version,

Таким образом, вы должны избегать всего, что выглядит ${...} внутри <parent> блок. Обратная ситуация в порядке, хотя: на родительские свойства можно ссылаться в другом месте файла pom:

<project>

    <!-- parent's GAV: inspected first, cannot use tokens -->
    <parent>
        <groupId>com.GRP.id</groupId>
        <artifactId>parent-id</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <!-- project's GAV: inspected second, may reference parent -->
    <groupId>${parent.groupId}</groupId>
    <artifactId>child-id</artifactId>
    <version>${parent.version}</version>
    <properties>
        <some.prop.name>${parent.artifactId}</some.prop.name>     <!-- parent-id -->
        <some.other.prop>${project.artifactId}</some.other.prop>  <!-- child-id -->
    </properties>
</project>

Подумайте об этом так: если у вас есть сын или дочь, вы можете назвать их в честь себя - но не имеет смысла называть вас в честь вашего ребенка, так как вы впервые появились на свет!

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:

Давайте снова посмотрим на ваш пример pom:

<parent>
    <groupId>com.GRP.id</groupId>
    <artifactId>ARTIFACT_ID</artifactId>
    <version>${project.version}</version>      <!-- value doesn't exist yet -->
    <relativePath>../pom.xml</relativePath>
</parent>

Таким образом, в файле pom.xml вашего ребенка, <parent> блок содержит ссылку на ${project.version}, Но, как упоминалось выше, это значение еще не существует, так как <parent> Блок - это первое, что мы оцениваем.

Если вы измените его следующим образом, все будет хорошо:

<parent>
    <groupId>com.GRP.id</groupId>
    <artifactId>ARTIFACT_ID</artifactId>

  <!-- EDIT 3A: parent.version is mandatory and must be a static value -->
    <version>1.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.GRP.id</groupId>
<artifactId>CHILD_ARTIFACT_ID</artifactId>

<!-- EDIT 3B: project.version is optional, can be deleted
<version>${parent.version}</version>
-->

РЕДАКТИРОВАТЬ 2

Последний бит информации.

Помните, когда вы изначально запускаете mvn compile в командной строке вы запускаете из каталога дочернего pom.

Maven еще не знает, где находится родительский файл pom.xml.

Это должно использовать <parent> Блок, чтобы выяснить, где находится файл POM, только тогда он может прочитать содержимое файла.

Надеюсь, что все проясняет.

Я хотел бы поделиться своей работой вокруг, я использовал Maven 3.5.2

  1. Запустите mvn version:set, который обновит версию родительского и версии родительского в дочерних модулях.

  2. Создайте агрегатный pom или родительский pom, который должен собрать все дочерние модули

  3. Если у вас есть локальный репозиторий или репозиторий Nexus, внесите изменения в обновленные версии.

  4. Теперь все дочерние модули имеют фиксированную родительскую версию, которая была установлена ​​на шаге 1, мы можем использовать дочерние модули в качестве зависимости между несколькими проектами.

Maven позволяет вам использовать ${project.version} в POM ребенка. Он просто ссылается на версию родителя, которую он может найти, ища родительский POM, который вы указываете с помощью тега lativePath.

Вы случайно используете Дженкинс? Если это так, это известная проблема в Jenkins. Взгляните на это: https://issues.jenkins-ci.org/browse/JENKINS-23846

Если нет, то какую версию Maven вы используете?

Что касается несвязанного примечания, значением по умолчанию для lativePath является../pom.xml, поэтому вам не нужно явно указывать это (как это делает ваш пример POM), если ваш проект следует стандартной многомодульной структуре.

Другие вопросы по тегам