1. Фон
В моем проекте maven есть много модулей и подмодулей с jars
и wars
, и все работает. Я также могу развернуть его на сервере без каких-либо проблем.
Я решил следовать этому преобразованию имен maven, я делаю несколько тестов с project.name
и project.build.finalName
, чтобы иметь соответствующее имя.
Образец, который я определил для создания project.name
для корневого артефакта, company-${project.artifactId}
, а для модулей и подмодулей ${project.parent.name}-${project.artifactId}
:
- компания-любой-артефакт любой-module1
- компания-любой-артефакт любой-module2-любой-submodule1
- компания-любой-артефакт любой-module2-любой-submodule2
Шаблон для project.build.finalName
равен ${project.name}-${project.version}
:
- компания-любой-артефакт любой-module1-1.0.jar
- компания-любой-артефакт любой-module2-любой-submodule1-2.0.jar
- компания-любой-артефакт любой-module2-любой-submodule2-3.0.war
Но вместо создания этих файлов maven дает мне StackOverflowError
.
2. Пример воспроизведения ошибки
Вы можете клонировать этот пример из github: https://github.com/pauloleitemoreira/company-any-artifact
В github есть ветвь master
, которая будет воспроизводить эту ошибку. И есть only-modules
ветвь, это рабочий пример, который использует ${project.parent.name}
для генерации jar finalName
, как я хочу.
Рассмотрим проект maven с одним артефактом pom pom, одним модулем pom и одним подмодулем.
-any-artifact
|
|-any-module
|
|-any-submodule
2.1 any-artifact
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>any-artifact</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>company-${project.artifactId}</name>
<modules>
<module>any-module</module>
</modules>
<!-- if remove finalName, maven will not throw StackOverflow error -->
<build>
<finalName>${project.name}-${project.version}</finalName>
</build>
</project>
2.2 любой модуль
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>any-artifact</artifactId>
<groupId>com.company</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.company.any-artifact</groupId>
<artifactId>any-module</artifactId>
<packaging>pom</packaging>
<name>${project.parent.name}-${project.artifactId}</name>
<modules>
<module>any-submodule</module>
</modules>
</project>
2.3 любой подмодуль
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>any-module</artifactId>
<groupId>com.company.any-artifact</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.company.any-artifact.any-module</groupId>
<artifactId>any-submodule</artifactId>
<name>${project.parent.name}-${project.artifactId}</name>
</project>
3. Проблема
При попытке mvn clean install
, maven дает мне StackOverflowError
:
Exception in thread "main" java.lang.StackOverflowError
at org.codehaus.plexus.util.StringUtils.isEmpty(StringUtils.java:177)
at org.codehaus.plexus.util.introspection.ReflectionValueExtractor.evaluate(ReflectionValueExtractor.java:194)
at org.codehaus.plexus.util.introspection.ReflectionValueExtractor.evaluate(ReflectionValueExtractor.java:163)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:266)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:143)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:174)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:143)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:429)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:143)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:174)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:143)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:429)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:143)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:174)
at org.apache.maven.plugin.PluginParameterExpressionEvaluator.evaluate(PluginParameterExpressionEvaluator.java:143)
Важно знать, что ошибка возникает только тогда, когда мы работаем с подмодулями. Если мы создадим проект с корневым POM-артефактом и модулем jar, ошибка не возникает.
4. Вопрос
Почему эта ошибка возникает только при использовании подмодулей?
Любое предложение решить мою проблему? Должен ли я забыть его и установить project.name
и project.build.fileName
вручную для каждого проекта, следуя шаблону, который я хочу?
ВАЖНО ОБНОВЛЕНО:
Некоторые ответы просто говорят, что используйте &{parent.name}
, но он не работает. Пожалуйста, вопрос с щедростью, перед тем, как ответить на этот вопрос, попробуйте проверить свое решение с помощью Maven version 3.3.9
.
Версия Maven 3.3.9
Изменить. Добавляя детали к вопросу с фазой при возникновении ошибки, все работает нормально до фазы prepare-package
, но StackOverflow происходит на этапе package
на жизненном цикле maven для проекта.