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手动从命令行中固定在竹子主机上。使用-e-X调用Maven没有其他有用的信息;堆栈Trace只是表明汇编失败。

此外,目标/测试类目录存在并包含所有35个预期.class文件;看来编译与我预期的一样成功。

我已经搜寻了POM和父pom,寻找与测试编译相有关的钩子。我什么也没找到,上面的输出表明没有。

我不知所措,因为什么可能导致Maven认为没有编译器错误。有人以前看过吗?

简短版本:javac遇到了一个stackoverflowerror(讽刺的是!😄(,这是由693深的链条方法在构建器上调用。

诊断:我们使用Maven的-X输出将实际命令提取到Javac,然后单独执行。这为我们提供了Javac的完整输出,而Maven似乎无法使用。输出告诉我们它正在使用哪个课程,然后吐出SOE的StackTrace。然后,我查看了该文件的投入历史,发现,与我犯下的微不足道的变化一致,其他人在建造者链中添加了一些电话。

为了验证诊断,我们在Javac的Args中添加了-J-Xss256M并再次运行。汇编成功。然后,我没有用非标准的Args运行编译器(并花时间弄清楚如何使Maven以这种方式调用(,而是将构建器链分成两个较小的链条。随着这种变化的承诺,构建现在正在传递给竹子。

注意:在问题中,我说编译器输出包含所有35个预期的类文件;这是一个巧合。它包含35个文件,与源文件的数量匹配,但是由于某些内部类,35 .Java文件应生成42个.class文件。

我们正在使用旧版本的Maven-Compiler-Plugin(v3.1,2013年(。我将尝试一下较新版本是否可以更好地暴露失败。

看来创建者的错误有不同的错误原因。但是,由于我的问题让我在这里,我有一个不同的原因:检查您是否在某处拨出编译器插件:

例如。这样:

<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通常设置了正确的设置,并且不会在本地窗口中设置它的位置。由于分叉编译器不会返回有用的信息,因此错误根本无济于事。

i有相同的错误,但是原因是不同的。就我而言,父pom.xml包括了编译器的路径:

<executable>/opt/java8/bin/javac</executable>

我的机器上不存在。

增加了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

maven 3.1.1很旧,并且在发布时尚未出现JDK8,因此它可能无法正确处理您的Java 8项目。Maven-Compiler-Plugin的故事相同。检查Maven发行历史记录和Maven-Compiler-Plugin版本和Java发布日期,以获取更多交叉引用。

所以,这是(按成功的机会订购(:

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

相关内容

最新更新