1. 背景
我的 maven 项目有很多模块和子模块,jars
并且wars
一切正常。我也可以毫无问题地将它部署在服务器上。
我决定遵循这个 maven 命名转换,我正在做一些测试project.name
并project.build.finalName
有一个合适的名字。
project.name
我为根工件定义的模式是company-${project.artifactId}
,模块和子模块是${project.parent.name}-${project.artifactId}
:
- 公司任何工件任何模块1
- 公司任何工件任何模块2任何子模块1
- 公司任何工件任何模块2任何子模块2
的模式project.build.finalName
是${project.name}-${project.version}
:
- 公司-任何-工件-任何-module1-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 中有一个master
分支,它将重现此错误。还有一个分支,这是一个可以根据需要生成 jaronly-modules
的工作示例。${project.parent.name}
finalName
让我们考虑一个具有一个根 pom 工件、一个 pom 模块和一个子模块的 maven 项目。
-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
,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 生命周期阶段。