具有显式 finalName 的 Maven 将无法正常工作如何解决这个问题建议
1. 背景
我的 maven 项目有很多模块和子模块,一切都可以正常工作。我也可以毫无问题地将其部署到服务器上。jars
wars
我决定遵循这个专家命名转换,我正在做一些测试,并有一个合适的名称。project.name
project.build.finalName
我为根工件定义的模式是模块和子模块的:project.name
company-${project.artifactId}
${project.parent.name}-${project.artifactId}
- 公司-任何-工件-任何-模块1
- company-any-artifact-any-module2-any-submodule1
- company-any-artifact-any-module2-any-submodule2
的模式为:project.build.finalName
${project.name}-${project.version}
- 公司-任何-工件-任何-模块1-1.0.jar
- company-any-artifact-any-module2-any-submodule1-2.0.jar
- company-any-artifact-any-module2-any-submodule2-3.0.war
但是,maven没有生成这些文件,而是给了我一个.StackOverflowError
2. 重现错误的示例
您可以从github克隆此示例:https://github.com/pauloleitemoreira/company-any-artifact
在github中,有一个主
分支,它将重现此错误。而且只有模块
分支,这是一个工作示例,用于根据需要生成jar。${project.parent.name}
finalName
让我们考虑一个 maven 项目,其中包含一个根 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. 问题
当尝试时,maven给了我一个: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
版本 3.3.9
编辑 - 在错误发生时向问题添加详细信息,在阶段之前一切正常,但 StackOverflow 发生在项目的 maven 生命周期阶段。prepare-package
package