我有一个用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
其他类似构建的服务构建良好。当我在本地运行它时,这个构建会通过。它也可以从命令行手动使用Maven 3.5.0在Bamboo主机上构建。使用-e或-X调用Maven不会提供其他有用信息; stacktrace只表示编译失败。
此外,target / test-classes目录存在并包含所有35个预期的.class文件;看起来编译就像我预期的那样成功。
我已经搜索了POM和父POM,寻找与测试编译阶段相关的钩子。我什么也没找到,上面的输出表明没有。
我不知道是什么原因导致Maven认为当没有编译器错误时会出现编译错误。有没有人见过这个?
答案 0 :(得分:2)
简短版本:javac遇到了StackOverflowError(具有讽刺意味的是:D),这是由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年起)。我将尝试更新版本是否能更好地揭露失败。
答案 1 :(得分:0)
Maven 3.1.1已经很老了,JDK8在发布时还没有出现,因此它可能无法正确处理你的Java 8项目。 maven-compiler-plugin的故事也是如此。检查Maven Release History和maven-compiler-plugin releases以及Java release dates以获取更多交叉引用。
所以,(成功的机会):
<pluginManagement>
答案 2 :(得分:0)
似乎创建者的错误有不同的错误原因。但是由于我的问题让我来了,所以我有另一个原因:检查是否将编译器插件分叉到某个地方:
例如像这样:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<fork>true</fork>
<meminitial>512m</meminitial>
<maxmem>2048m</maxmem>
<compilerArgs>
<arg>-XX:MaxPermSize=256m</arg>
</compilerArgs>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
在这种情况下,结果可能很难看。它可以在通常正确设置JAVA_HOME的某些机器上工作,而不能在您仅在本地窗口中设置的地方使用。该错误根本没有帮助,因为分叉的编译器将不会返回有用的信息。
答案 3 :(得分:0)
我有相同的错误,但是原因不同。就我而言,父pom.xml包含了一个编译器的路径:
var pdfApi = RestService.For<IPdfApi>("https://goodmorning-axa-dev.azure-api.net");
var pdf = new PdfFile();
var file = new File();
file.MimeType = "application/pdf";
file.Base64Data= "base64-data="; // append base64 encoded data here
pdf.File = file;
await pdfApi.UploadPdf(pdf, "myapikey");
我的机器上不存在。
答案 4 :(得分:0)
在 maven-compiler-plugin 的配置中增加内存有帮助!这是pom.xml
的相关片段:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>${java.version}</release>
<source>${java.version}</source>
<target>${java.version}</target>
<meminitial>512m</meminitial>
<maxmem>2048m</maxmem>
</configuration>
</plugin>
在这个 maven 提出了我的问题的根本原因(一些检查样式插件错误)之后,我可以解决它。就我而言java.version = 11
。