我有一个用Maven构建的Java应用程序。我们的CI系统(Bamboo)配置为使用Maven 3.1.1,我在本地使用Maven 3.5。我们到处都在使用Java 8 u152;我也可以用8 u144重现这个问题。
今天,在我对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不会提供额外的有用信息; stacktrace只是指出有一个编译失败。
此外,target/test-classes目录存在,并且包含所有35个预期的.class文件;看来编译和我预期的一样成功。
我已经搜索了POM和父POM,寻找与测试编译阶段相关的钩子。我什么也没找到,上面的输出表明没有。
我不知道是什么原因导致Maven认为有编译器错误,而实际上没有。有人见过这个吗?
5条答案
按热度按时间3phpmpom1#
简短版本:javac遇到了StackOverflowError(讽刺的是!)😄,这是由Builder上的693深度链式方法调用引起的。
诊断:我们使用Maven的
-X
输出将实际的命令提取到javac中,然后单独执行。这给了我们javac的完整输出,这在Maven中似乎是不可用的。输出告诉我们它正在处理哪个类,然后输出SOE的堆栈跟踪。然后,我查看了该文件的提交历史,发现与我提交的琐碎更改一致,其他人向构建器链添加了一些调用。为了验证诊断结果,我们将
-J-Xss256M
添加到javac的args中并再次运行它;编译成功了。我没有使用非标准参数运行编译器(并花时间弄清楚如何让Maven以这种方式调用它),而是将构建器链拆分为两个较小的链。提交了该更改后,构建现在正在Bamboo中传递。注意:在问题中,我说编译器输出包含所有35个预期的类文件;这是一个巧合。它包含35个文件,这与源文件的数量相匹配,但是由于一些内部类,35个.java文件应该生成42个.class文件。
我们使用的是旧版本的maven-compiler-plugin(v3.1,从2013年开始)。我将试验新版本是否能更好地暴露故障。
nc1teljy2#
看来,造物主的错误有一个不同的错误原因。但既然我的问题让我在这里,我有一个不同的原因:检查你是否在某个地方fork了编译器插件:
例如:
<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设置通常是正确的,而不是在本地窗口中设置它。这个错误根本没有帮助,因为分叉的编译器不会返回有用的信息。
ubbxdtey3#
我也犯了同样的错误,但原因不同。在我的例子中,父pom.xml包含了一个编译器的路径:
我的机器上没有
9bfwbjaz4#
在maven-compiler-plugin的配置中增加内存有帮助!以下是
pom.xml
的相关片段:在此之后,maven提出了我的问题的根本原因(一些检查风格的插件错误),我可以解决它。在我的情况下
java.version = 11
。epggiuax5#
Maven 3.1.1已经很老了,而JDK 8在发布时还没有出现,因此它可能无法正确处理Java 8项目。maven-compiler-plugin也是一样。检查Maven Release History和maven-compiler-plugin releases和Java release dates以获得更多的交叉引用。
所以,要么(按成功的机会排序):
1.更改为任何Maven 3.x > 3.1.x
1.通过
<pluginManagement>
将maven-compiler-plugin的版本更改为3.7.01.缩小代码范围以发现哪些编译错误未得到正确管理