Maven с явным finalName не будет работать должным образом
1. Фон
Мой проект Maven имеет много модулей и субмодулей сjars
а такжеwars
и все работает. Я также могу развернуть его на сервере без каких-либо проблем.
Я решил следоватьэто преобразование имен MavenЯ делаю некоторые тесты сproject.name
а такжеproject.build.finalName
иметь подходящее имя.
Шаблон, который я определил для созданияproject.name
для корневого артефактаcompany-${project.artifactId}
и для модулей и субмодулей${project.parent.name}-${project.artifactId}
:
Шаблон дляproject.build.finalName
является${project.name}-${project.version}
:
Но вместо того, чтобы создавать эти файлы, Maven дает мнеStackOverflowError
.
2. Пример для воспроизведения ошибки
Вы можете клонировать этот пример из github:https://github.com/pauloleitemoreira/company-any-artifact
В github естьmaster
ветка, которая будет воспроизводить эту ошибку. И естьonly-modules
ветвь, это рабочий пример, который использует${project.parent.name}
создать банкуfinalName
как я хочу.
Давайте рассмотрим проект maven с одним артефактом root pom, одним модулем pom и одним подмодулем.
-any-artifact
|
|-any-module
|
|-any-submodule
2.1 любой артефакт
<?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
Мавен дает мне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 для проекта.