【问题标题】:maven assembly throwing stackoverflowerrormaven程序集抛出stackoverflowerror
【发布时间】:2011-09-07 06:09:40
【问题描述】:

大家好,stackoverflow,

我在使用 maven 时遇到问题,特别是在组装阶段。我有一个大型的多模块遗留项目,不幸的是它的子模块中有一些循环引用。它已被改造为使用 maven 构建,但重构循环引用将花费太长时间。

该项目通过运行 mvn install 构建良好,甚至运行 mvn package 没有问题,但在运行 mvn package assembly:assembly 时失败。由于“创建程序集存档分发时出错:您必须设置至少一个文件”,尝试使用 assembly:single 运行它会导致构建失败。

使用 assembly:assembly,它似乎一遍又一遍地处理相同的库,最终抛出 stackoverflowerror。我猜这意味着模块中的循环引用导致了这种情况,尽管因为它编译没有问题,我希望它也能在汇编中幸存下来。

还有其他原因吗?

项目结构如下:

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>

dist-proj 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>

还有汇编文件:

<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>

非常感谢任何帮助。

【问题讨论】:

  • 我假设你的父 pom 在 pluginManagement 部分包含 maven-assembly-plugin 的配置?或者你有它在构建部分?如果是,则将其删除。此外,我假设您将 maven-assembly-plugin 绑定到的 dist-projec pom 中的阶段不是“组装”,导致这样的生命周期阶段不存在。例如,您可以将其绑定到“打包”阶段。
  • 是的,它在 pluginManagement 部分。另外,生命周期绑定是对的,它曾经绑定到包,但我把它拿出来方便调试。我以为会有一个组装阶段,但一个不存在的也可以。
  • 你 dist-project pom 有包装“pom”吗?
  • 是的。抱歉,我会把整个 pom 都放上来,但我试图让问题保持简洁。
  • 你为什么调用 mvn package 而不是补充目标:assembly:assembly?为什么不简单的 mvn 包?如果您正确配置了 maven-assembly-plugin,那么一切都应该运行良好...... mvn clean package 是否工作正常并生成正确的存档?这一切都在您的程序集描述符中吗,看起来不完整?

标签: maven maven-assembly-plugin stack-overflow


【解决方案1】:

我也遇到过这个错误。查看 Plexus Archiver 源代码,AbstractArchiver 中的 getResources 返回的 hasNext 方法在每次遇到它已经看到的类或工件时都会调用自己。即使在中等规模的项目中,这也会导致堆栈空间不足。

目前最简单的修复方法是通过 MAVEN_OPTS 增加堆栈空间,例如

export MAVEN_OPTS=-Xss2m

详情请见http://jira.codehaus.org/browse/MASSEMBLY-549

【讨论】:

    【解决方案2】:

    要仅创建一个包含所有依赖项的 jar,您只需使用 predefined descriptor

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <descriptorRefs>
               <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>
    

    【讨论】:

    • 是的,但我想做更多的事情,比如不解压依赖的 jars 并且对运行时库进行传递过滤。
    • 如果您想更改默认行为,只需使用给定的描述符(从网站复制它)并适当地更改它。
    • 这实际上是我所做的 :) 我使用 jar-with-dependencies 描述符作为模板,并进行了一些修改以实现我想要的。
    • 在将 maven 程序集插件升级到 2.2.1 版(而不是隐式插件)后,我不再收到 stackoverflow 错误。
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2012-04-29
    • 1970-01-01
    • 2013-01-12
    • 2018-07-10
    • 2023-03-10
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多