在Jenkins上执行mvn clean install时发生栈溢出错误

后端开发 2026-07-09

我有一个Spring Boot工件,在开发机通过Maven可以完美构建,但在我们的Jenkins服务器上构建会因为StackOverflowError失败(下面是堆栈跟踪)。

这是我们所有工件中唯一会遇到此错误的一个。

如果我用 -Xss2M 增加堆栈大小,问题就解决了,但我不明白为什么在开发机上能正常工作却需要这样做。此外我在想这是否是一个正确的解决方案,还是只是掩盖了一个应该解决的潜在问题(除了从架构层面彻底改造工件使调用栈不再那么深)。

Maven版本:3.8.7
Java版本:21.0.10,但我也尝试过17。

堆栈跟踪:

[[1;34mINFO[m] Compiling 698 source files to /var/lib/jenkins/workspace/artifact/target/classes

An exception has occurred in the compiler (21.0.10). Please file a bug against the Java compiler via the Java bug reporting page (https://bugreport.java.com) after checking the Bug Database (https://bugs.java.com) for duplicates. Include your program, the following diagnostic, and the parameters passed to the Java compiler in your report. Thank you.

java.lang.StackOverflowError

                at jdk.compiler/com.sun.tools.javac.code.Scope.includes(Scope.java:147)

                at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readMethod(ClassReader.java:2618)

                at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:2945)

                at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClassBuffer(ClassReader.java:3036)

                at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:3060)

                at jdk.compiler/com.sun.tools.javac.code.ClassFinder.fillIn(ClassFinder.java:373)

                at jdk.compiler/com.sun.tools.javac.code.ClassFinder.complete(ClassFinder.java:302)

                at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:683)

                at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1452)

                at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.complete(Type.java:1203)

                at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.getTypeArguments(Type.java:1129)

                at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.allparams(Type.java:1151)

                at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.isRaw(Type.java:1189)

                at jdk.compiler/com.sun.tools.javac.code.Types.capture(Types.java:4400)

                at jdk.compiler/com.sun.tools.javac.comp.InferenceContext.cachedCapture(InferenceContext.java:561)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2643)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)




...




                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4409)

                at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)

                at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2626)

解决方案

编译器为进行编译而解析文本并进入某种循环,导致尝试编译的线程因大量的递归调用而耗尽内存,类似的情况可能会导致这个问题:

obj.method().field.method().field...

使用递归泛型也容易导致这种情况

class A>

或者Lombok与类似写法

@Data
class A {
    private B b;
}

@Data
class B {
    private A a;
}

还有lambda表达式、循环依赖……你应该懂我的意思了……如果递归问题还没引起你的警觉,请回到我回答的开头再读一遍。

关于在开发环境发生而在生产环境不发生的问题,请先核对JAR是否100% 相同,甚至连传递依赖也要逐一核对,然后再下结论,因为开发环境和生产环境在多种原因下几乎从来不是完全相同。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章