【发布时间】:2017-03-13 05:21:26
【问题描述】:
1.背景
我的 maven 项目有很多带有 jars 和 wars 的模块和子模块,并且一切正常。我也可以毫无问题地将它部署在服务器上。
我决定关注this maven naming conversion,我正在使用project.name 和project.build.finalName 进行一些测试,以获得合适的名称。
我为根工件创建project.name 定义的模式是company-${project.artifactId},而模块和子模块的模式是${project.parent.name}-${project.artifactId}:
- company-any-artifact-any-module1
- company-any-artifact-any-module2-any-submodule1
- company-any-artifact-any-module2-any-submodule2
project.build.finalName 的模式是${project.name}-${project.version}:
- company-any-artifact-any-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 分支,它会重现此错误。还有only-modules 分支,这是一个工作示例,它使用${project.parent.name} 生成我想要的jar 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 发生在 @ 987654353@ 项目的 Maven 生命周期阶段。
【问题讨论】:
-
你想在哪里生成 .jar?
-
首先,如果您尝试生成战争,则必须将包装更改为战争,而不是进一步删除 outputDirectory 配置,因为它通常没有意义。
-
@Paolo 我可以重现 stackoverflowerror 的问题,但即使将 finalName 注释掉,我也无法重现这种情况。它不会给出错误,但它也不能用作名称。由于父名没有被继承,我看不出这怎么可能奏效。
-
这是我的 2 美分。
标签中没有带有 的标签。看一下 maven 项目描述符maven.apache.org/ref/3-LATEST/maven-model/maven.html。所以 ${project.parent.name} 根本不是一个有效的表达式。正确的解决方法是在每个项目 pom.xml 的名称标签中包含文字值。名字也不能继承。所以我认为你正在尝试做的事情甚至都没有得到官方的支持.. -
这里是完全相同的场景,如果有帮助的话,它已经被关闭,因为不是问题。 issues.apache.org/jira/browse/MNG-5784。一旦您将每个文件中的名称更改为唯一,一切都应该检查好,是的,如果您使用有效的表达式,您可以将最终构建名称设为您喜欢的名称。
标签: java maven stack-overflow maven-package