maven assembly throw stackoverflowerror

时间:2011-09-07 06:09:41

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

高级堆栈溢出,

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

通过运行mvn install可以很好地构建项目,甚至可以毫无问题地运行mvn包,但是在运行mvn package assembly:assembly时会失败。尝试使用程序集运行它:单个给我一个构建失败,因为“创建程序集存档发行版时出错:你必须至少设置一个文件”。

使用assembly:assembly,它似乎一遍又一遍地处理相同的库,最终抛出stackoverflower错误。我猜这意味着模块中的循环引用正在引起这种情况,尽管因为它没有任何问题,我希望它能够在组装过程中存活下来。

还有其他原因吗?

项目结构如下:

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>

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:15)

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

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

export MAVEN_OPTS=-Xss2m

有关详细信息,请参阅http://jira.codehaus.org/browse/MASSEMBLY-549

答案 1 :(得分:1)

要仅创建包含所有依赖项的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>