我有一个使用 Maven 构建的 Java 应用程序。我们的 CI 系统 (Bamboo) 配置为使用 Maven 3.1.1,我在本地使用 Maven 3.5。我们到处都在使用 Java 8u152;我也可以使用 8u144 重现该问题。
今天,在我对 Java 代码进行了细微的更改后,我们开始收到此错误(混淆了路径和项目名称):
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ project-name ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 35 source files to /bamboo/bamboo-home/xml-data/build-dir/ASP-CAS-CJT/project/service/target/test-classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.036s
[INFO] Finished at: Tue Feb 13 15:15:51 EST 2018
[INFO] Final Memory: 26M/715M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-testCompile) on project project-name: Compilation failure -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
其他类似构建的服务构建良好。当我在本地运行时,这个构建通过了。它还可以在 Bamboo 主机上从命令行手动使用 Maven 3.5.0 构建良好。使用 -e 或 -X 调用 Maven 不会提供额外的有用信息;堆栈跟踪仅表明存在编译失败。
此外,target/test-classes 目录存在并包含所有 35 个预期的 .class 文件;编译似乎和我预期的一样成功。
我搜索了 POM 和父 POM,寻找与测试编译阶段相关的 Hook 。我什么也没找到,上面的输出表明没有。
我不知道是什么导致 Maven 认为存在编译器错误,而实际上并没有。有人以前见过这个吗?
最佳答案
简短版本:javac 遇到 StackOverflowError(具有讽刺意味!😄),这是由对 Builder 的 693 深度链接方法调用引起的。
诊断:我们使用 Maven 的 -X
输出将实际命令提取到 javac,然后单独执行。这为我们提供了 javac 的完整输出,使用 Maven 似乎无法获得。输出告诉我们它正在处理哪个类,然后吐出 SOE 的堆栈跟踪。然后,我查看了对该文件的提交历史,发现与我提交的微小更改一致的是,其他人已经向构建器链添加了一些调用。
为了验证诊断,我们将-J-Xss256M
添加到javac 的args 中并再次运行;编译成功。我没有使用非标准 args 运行编译器(并花时间弄清楚如何让 Maven 以这种方式调用它),而是将构建器链分成两个较小的链。随着该更改的提交,构建现在正在通过 Bamboo。
注意:在问题中,我说编译器输出包含所有 35 个预期的类文件;这是一个巧合。它包含 35 个文件,与源文件的数量相匹配,但由于一些内部类,35 个 .java 文件应该生成 42 个 .class 文件。
我们使用的是旧版本的 maven-compiler-plugin(v3.1,自 2013 年起)。我将试验新版本是否能更好地暴露故障。
关于java - Maven 编译错误,编译器没有任何错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48775213/