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

kwvwclae  于 2023-10-17  发布在  Maven
关注(0)|答案(5)|浏览(148)

我有一个用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认为有编译器错误,而实际上没有。有人见过这个吗?

3phpmpom

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年开始)。我将试验新版本是否能更好地暴露故障。

nc1teljy

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设置通常是正确的,而不是在本地窗口中设置它。这个错误根本没有帮助,因为分叉的编译器不会返回有用的信息。

ubbxdtey

ubbxdtey3#

我也犯了同样的错误,但原因不同。在我的例子中,父pom.xml包含了一个编译器的路径:

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

我的机器上没有

9bfwbjaz

9bfwbjaz4#

在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

epggiuax

epggiuax5#

Maven 3.1.1已经很老了,而JDK 8在发布时还没有出现,因此它可能无法正确处理Java 8项目。maven-compiler-plugin也是一样。检查Maven Release Historymaven-compiler-plugin releasesJava release dates以获得更多的交叉引用。
所以,要么(按成功的机会排序):
1.更改为任何Maven 3.x > 3.1.x
1.通过<pluginManagement>将maven-compiler-plugin的版本更改为3.7.0
1.缩小代码范围以发现哪些编译错误未得到正确管理

相关问题