Не удалось разрешить ${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
Запустите mvn version:set, который обновит версию родительского и версии родительского в дочерних модулях.
Создайте агрегатный pom или родительский pom, который должен собрать все дочерние модули
Если у вас есть локальный репозиторий или репозиторий Nexus, внесите изменения в обновленные версии.
Теперь все дочерние модули имеют фиксированную родительскую версию, которая была установлена на шаге 1, мы можем использовать дочерние модули в качестве зависимости между несколькими проектами.
Maven позволяет вам использовать ${project.version} в POM ребенка. Он просто ссылается на версию родителя, которую он может найти, ища родительский POM, который вы указываете с помощью тега lativePath.
Вы случайно используете Дженкинс? Если это так, это известная проблема в Jenkins. Взгляните на это: https://issues.jenkins-ci.org/browse/JENKINS-23846
Если нет, то какую версию Maven вы используете?
Что касается несвязанного примечания, значением по умолчанию для lativePath является../pom.xml, поэтому вам не нужно явно указывать это (как это делает ваш пример POM), если ваш проект следует стандартной многомодульной структуре.