Maven编译错误,编译器没有任何错误

时间:2018-02-13 20:36:59

标签: java maven

我有一个用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认为当没有编译器错误时会出现编译错误。有没有人见过这个?

5 个答案:

答案 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 Historymaven-compiler-plugin releases以及Java release dates以获取更多交叉引用。

所以,(成功的机会):

  1. 更改为任何Maven 3.x> 3.1.X
  2. 通过<pluginManagement>
  3. 将maven-compiler-plugin的版本更改为3.7.0
  4. 缩小代码以发现未正确管理的编译错误

答案 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