maven组件溢出错误
嗨,stackoverflow的居民们 我对maven有意见,特别是在组装阶段。我有一个大型的多模块遗留项目,不幸的是它的子模块中有一些循环引用。它已经被改造为使用maven构建,但是重构循环引用将花费太长时间 该项目通过运行mvn安装构建良好,甚至可以毫无问题地运行mvn包,但在运行mvn包assembly:assembly时失败。尝试使用assembly:single运行它会导致生成失败,原因是“创建程序集存档发行版时出错:您必须至少设置一个文件” 对于assembly:assembly,它似乎一次又一次地处理相同的库,最终抛出StackOverflower错误。我猜这意味着模块中的循环引用导致了这种情况,尽管由于它编译时没有任何问题,我希望它也能在汇编中幸存下来 还有其他原因吗 项目结构如下:maven组件溢出错误,maven,maven-assembly-plugin,stack-overflow,Maven,Maven Assembly Plugin,Stack Overflow,嗨,stackoverflow的居民们 我对maven有意见,特别是在组装阶段。我有一个大型的多模块遗留项目,不幸的是它的子模块中有一些循环引用。它已经被改造为使用maven构建,但是重构循环引用将花费太长时间 该项目通过运行mvn安装构建良好,甚至可以毫无问题地运行mvn包,但在运行mvn包assembly:assembly时失败。尝试使用assembly:single运行它会导致生成失败,原因是“创建程序集存档发行版时出错:您必须至少设置一个文件” 对于assembly:assembly,它
Parent
|_ Child1
|_ Child2
|_ dist-proj
父pom有以下部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly-dependencies.xml</descriptor>
</descriptors>
</configuration>
</plugin>
<modules>
<module>Child1</module>
<module>Child2</module>
<module>dist-proj</module>
</modules>
org.apache.maven.plugins
maven汇编插件
2.2.1
src/main/assembly/assembly-dependencies.xml
孩子1
孩子2
地区项目
地区项目pom:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>dist-proj</id>
<phase>assembly</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly-dependencies.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven汇编插件
2.2.1
地区项目
装配
单一的
src/main/assembly/assembly-dependencies.xml
和程序集文件:
<moduleSets>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<includes>
<include>groupid:Child1</include>
<include>groupid:Child2</include>
</includes>
<binaries>
<outputDirectory>${project.build.finalName}</outputDirectory>
<unpack>false</unpack>
<dependencySets>
<dependencySet>
<includes/>
<scope>compile</scope>
</dependencySet>
<dependencySet>
<includes/>
<scope>runtime</scope>
<useTransitiveFiltering>true</useTransitiveFiltering>
</dependencySet>
</dependencySets>
</binaries>
</moduleSet>
</moduleSets>
真的
groupid:Child1
groupid:Child2
${project.build.finalName}
假的
编译
运行时
真的
非常感谢您的帮助。要创建一个只包含所有依赖项的jar,只需使用
org.apache.maven.plugins
maven汇编插件
2.6
带有依赖项的jar
我也遇到了这个错误。查看Plexus Archiver源代码,AbstractArchiver中getResources返回的hasNext方法每次遇到已经看到的类或工件时都会调用自己。这导致即使在中等规模的项目上,它也会耗尽堆栈空间
目前最简单的修复方法是通过MAVEN_选项增加堆栈空间,例如
export MAVEN_OPTS=-Xss2m
有关更多详细信息,请参见我假设您的父pom在pluginManagement部分包含maven assembly插件的配置?或者在构建部分有吗?如果是,则将其移除。此外,我假设distprojecpom中绑定maven组装插件的阶段不是“组装”,因为这样的生命周期阶段不存在。例如,您可以将其绑定到“包”阶段。是的,它位于插件管理部分。另外,关于生命周期绑定,您是对的,它过去是绑定到包的,但我将其取出以便于调试。我原以为会有一个组装阶段,但一个不存在的阶段也可以。你认为项目pom有包装“pom”吗?是的。对不起,我本来会把整个pom都放上去的,但我一直在努力让问题简洁。为什么你要调用mvn包,而不是补充目标:组装:组装?为什么不简单的mvn包呢?如果您正确地配置了maven assembly插件,那么一切都应该正常工作……mvn clean package是否正常工作并生成正确的归档文件?这些都在您的程序集描述符中吗,它看起来不完整?是的,但我想做更多的事情,比如不解包依赖的JAR,以及对运行库进行传递筛选。如果您想更改默认行为,只需使用给定的描述符(从网站复制)并对其进行适当的更改。这实际上就是我所做的:)我使用了带有依赖项描述符的jar作为模板,并做了一些修改以实现我的目的。在将maven assembly插件升级到2.2.1版(而不是隐式插件)后,我不再出现stackoverflow错误。
export MAVEN_OPTS=-Xss2m