Jenkins未显示Maven编译错误。

16

在 Jenkins 中构建我们的多模块 Maven 3 项目时,如果存在构建错误,我们会收到一个晦涩的消息,称 Maven 编译器插件失败。这种情况只是在最近一周才开始出现:

[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:22.340s
[INFO] Finished at: Fri Feb 10 09:44:02 CET 2012
[INFO] Final Memory: 171M/318M
[INFO] ------------------------------------------------------------------------
mavenExecutionResult exceptions not empty
message : Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project me.activity.impl: Compilation failure
cause : Compilation failure
Stack trace : 
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project me.activity.impl: Compilation failure
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.jvnet.hudson.maven3.launcher.Maven3Launcher.main(Maven3Launcher.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239)
    at org.jvnet.hudson.maven3.agent.Maven3Main.launch(Maven3Main.java:158)
    at hudson.maven.Maven3Builder.call(Maven3Builder.java:104)
    at hudson.maven.Maven3Builder.call(Maven3Builder.java:70)
    at hudson.remoting.UserRequest.perform(UserRequest.java:118)
    at hudson.remoting.UserRequest.perform(UserRequest.java:48)
    at hudson.remoting.Request$2.run(Request.java:287)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
    at java.util.concurrent.FutureTask.run(FutureTask.java:123)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
    at java.lang.Thread.run(Thread.java:595)
Caused by: org.apache.maven.plugin.CompilationFailureException: Compilation failure
    at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:516)
    at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:114)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 27 more
Maven schlug mit Fehlern fehl.
An attempt to send an e-mail to empty list of recipients, ignored.

从命令行构建时,我们会得到正常的构建错误:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5:24.906s
[INFO] Finished at: Fri Feb 10 08:17:31 EST 2012
[INFO] Final Memory: 173M/328M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project me.activity.impl: Compilation failure: Compilation failure:
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[1018,12] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[200,16] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[234,16] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[263,16] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[294,20] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[311,16] cannot find symbol
[ERROR] symbol  : class ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[1023,47] cannot find symbol
[ERROR] symbol  : variable ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] \p4views\VM\Base\main\modules\activity\impl\src\main\java\com\sap\me\activity\impl\ExtensionConfigurationService.java:[1025,67] cannot find symbol
[ERROR] symbol  : variable ActivityRuntimeType
[ERROR] location: class com.sap.me.activity.impl.ExtensionConfigurationService
[ERROR] -> [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
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :me.activity.impl
我们在本地构建和Jenkins上都使用maven-3.0.4。 Jenkins版本是1.3ish,但我升级到1.450以查看问题是否会消失 - 结果并没有。这大约是我们从maven-2.2.1转移到maven-3.0.4的时间发生的,但我可以发誓(尽管我没有证据)我在maven升级后不久就在Jenkins上收到了正常的构建错误,所以我不认为是因为这个引起的,但这是唯一一个我能想到会引起这种情况的变化。编译器插件版本是2.0.2。

我看到一个类似的帖子在这里,但他的问题与eclipse构建有关,而不是Jenkins。

1
此外,在 Jenkins 的 Jira 页面上有一个问题(https://issues.jenkins-ci.org/browse/JENKINS-10333),但已经超过6个月了,没有采取任何行动。 - tdrury
1
我也使用了 -e -X 在 Jenkins 构建中运行,但输出中没有额外的信息 - 它没有包括编译器的语法错误。 - tdrury
1
尝试在Jenkins的脚本控制台中输入hudson.maven.MavenBuild.debug=true;,以获取有关Maven模块的更多信息。 - Michael
1
我在命令行上遇到了这个问题。使用最新的maven-compiler-plugin(2.4),maven(3.0.4)和Java(1.7.0_04)。当编译出错时,我无法获得任何符号/位置信息。唯一解决方法是降级到Java 6。 - andyb
抱歉,我的结果并不确定,基本上我放弃了,因为我无法按需重现这个问题。然而,自从这个问题出现后,我们已经更新了Jenkins(1.514)、maven(3.0.5)和编译器插件(2.3.2),并且再也没有遇到过这个问题。 - tdrury
显示剩余6条评论
4个回答

7

得到了一个答案,但它可能不适用于你,因为它似乎与许多事物和情况有关,我怀疑它确实适用于这里的大多数人。


故障排除

(如果您不关心我是如何在我的设置中解决此问题的,请跳过,但如果您需要快速解决问题,则可以直接看 Solution 1 部分。)

问题起源...

正在活跃开发的项目的当前工作目录今天开始输出显示此行为的日志,而一段时间以来没有任何错误。我使用的是Windows 7,Maven 3.0.4,编译器插件2.4和Java(c) 1.6.0_31。

当达到特定的子模块时,Maven将输出一些错误消息并使构建失败,但错误消息与此无关(报告使用专有的com.sun.* API),并且没有实际编译错误的迹象。

事情变得奇怪起来...

此时我找到了这个线程,并尝试使用不同的Java版本和Maven编译器插件版本重新构建。以下是有趣的部分:

  • 使用编译器插件2.5,我会遇到类似的问题,并且没有有效的错误报告;
  • 使用编译器插件2.3,我会遇到类似的问题,并出现一个无意义的错误报告,抱怨缺少一个包(虽然该包存在并在类路径上!)
  • 使用编译器插件2.3.2,我会遇到类似的问题,并出现一个无意义的错误报告,抱怨缺少一个包(虽然该包存在并在类路径上!)但是**在测试类的编译中的另一个点**(之前发生在常规类的编译期间)。

从奇怪到更奇怪

开始起疑心,我切换到具有项目干净检查的另一个目录并重新构建所有内容。

一切都工作得非常。这里充满困惑和绝望。

我意识到我在另一个工作区间的错误模块上正在处理一个相当庞大复杂的类。我的意思是相当庞大、复杂,且写得相当糟糕。这种类型的东西会让你告诉老板“请不要让我碰这个”,并且每次你不幸在IDE中遇到它时,你的DELETE键都会嘲笑你。实际上,这个东西看起来非常像黑暗魔法实验和怪异不道德的生物研究的产物,你会想知道它是不是直接从RTC Wolfenstein或Doom中出来的,如果敌人是代码片段的话。这种你不想独自编码到深夜的类,Sonar悄悄地报告了近1000个代码质量违规,包括复杂度指数,让你想知道PMD、JDepend和其他工具是否真的同时失效了。

但我偏离了主题...

我将它复制到这个干净的、看似正常的工作区(幸运的是,它没有影响其他文件,所以很简单:只需要复制过来)。

然后我用Maven重新构建,当它再次到达包含这个文件的模块时,它会变得非常烦躁,除了这一次它还打印出了一堆错误和永远不会结束的堆栈跟踪。所以我想尝试重新运行相同的构建,这次将输出保存到日志文件中以进行更仔细的查看,并且(这是新奇怪的事情,因为到目前为止还不够离奇)...它仍然没有显示任何错误。

因此,我认为显然出了什么非常恶心的问题,使得javac出现了类似栈溢出的错误,我正在寻找第一次运行时在日志中看到的一小段跟踪信息。以下是其中的一部分(因为我认为某些人可能会遇到这个问题,并且发现这个答案有用):

[ERROR] at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
[ERROR] at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:377)
[ERROR] at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1241)
[ERROR] at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1210)
[ERROR] at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
[ERROR] at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:1799)
[ERROR] at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1522)
[ERROR] at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
[ERROR] at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:377)
[ERROR] at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1241)
[ERROR] at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1210)
[ERROR] at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
[ERROR] at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:1799)
[ERROR] at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1522)

谷歌很好地提示我去 StackOverflow 寻找答案 :)

Maven 编译:执行 javac 失败

在这里我可以看到一个简单的尝试方法(见下文)。

当然,如果堆栈跟踪在所有情况和所有情况下都显示,并显示明显的 StackOverflowException,这将更容易排除故障。特别是考虑到我已经在其他情况下看到过此错误并知道它的含义,但在无法看到错误时要弄清楚它就要困难得多。

不确定为什么 Maven 吞掉了那个错误,但也许 javac 简单地崩溃了而没有通知,日志管理出现问题并且没有正确地刷新出来。

这也可以解释为什么这个 bug 相对随机发生:它会受到您的硬件设置和 javac 处理的类的轻微更改的影响。

那么,现在怎么办???如果 java 尝试处理您的代码时出现疯狂的堆栈溢出异常或 OutOfMemoryException,显然您需要执行类似于下面解释的操作...


解决方案

解决方案 1(也称“短期/快速/请让它工作”)

升级您的内存设置。最简单的方法是使用类似于以下内容的东西(对于类似于 bash 的 shell):

export MAVEN_OPTS="-Xss1024k -Xms512m -Xmx1024m"

注意:这些设置显然取决于您的平台硬件(以及您的Shell)。

在我的案例中,我实际上曾经使用过:

export MAVEN_OPTS="-Xss128k -Xms384m -Xmx384m"

因为我有一个比较繁重的项目和一台不太能承载内存的工作站,所以我需要尽可能地挤出每一点RAM,以便运行多个Eclipse实例、多个应用服务器等等。因此,我的JAVA_OPTS、ANT_OPTS和MAVEN_OPTS设置了许多选项,包括以下选项。

这不一定是你想要的!!在Windows上,64位JVM的默认xss实际上是1024,所以我使用了一个相对较小的值。我只是说这可能会帮助处于同样情况下的其他人。请根据您的配置适当地提高它。

因此,最终,为了解决我的项目中的这个特定问题,我不得不将以上内容更改为:

export MAVEN_OPTS="-Xss256k -Xms384m -Xmx384m"

现在一切都很完美。

也许对于你来说,还有其他的不同之处。请告诉我。

 

解决方案2(也称为“长期 / 禅”)

你知道比调节内存设置更好的是什么吗?那些其他人不知道该怎么调节的设置,而且可能没有机会调节,这会使你的构建不太便携。 [听众在此处尖叫]

彻底重构那个非常丑陋的类,使javac为其母亲哭泣。

就是这么简单。不要写成数千行长的类,不要用疯狂的静态初始化程序、超长方法和这些东西。如果你的代码对自己来说很复杂,那么对可怜的javac来说肯定也是复杂的。

今天拯救一个javac进程:重构你的代码!


1
+1 不错的调查。我会看看这对我的系统有什么影响。目前我仍在使用32位JVM。我的问题不是随机失败的构建本身,而是如果存在真正的编译错误,Jenkins和命令行不会打印它们。这是由于Java 7的输出与Java 6的输出不同,而且Plexus编译器没有正确捕获输出所致。 - andyb
1
我的问题不是随机失败的构建本身,而更多的是如果有真正的编译错误,Jenkins 和命令行不会打印它们。在我这种情况下,它会因为不是编译错误而失败。我一直在使用Java 7和Maven 3.0.4以及compiler-plugin 2.3.2,但自从2.4和2.5编译器插件以来,我还没有尝试过。 - haylem
@haylem 请看我的回答,尝试在实际模块的pom中定义编译器插件,而不是父级。 - Usman Ismail
@UsmanIsmail:我不知道那是否有帮助,我没有类来重现先前的错误情况。对我来说,这实际上是javac编译器因为大型类文件而崩溃的问题。因此,虽然您的解决方案可能会产生影响,但我认为它不是根本原因。 - haylem

0

我使用的Maven编译器插件版本是2.3.2。从下面的输出中,您可以看到我得到了错误,就像您预期的那样。

07:16:37  [INFO] Copying 0 resource
07:16:37  [INFO] 
07:16:37  [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ fusion-common ---
07:16:38  [INFO] Compiling 49 source files to /opt/jss/hudson/work/jobs/FMWJavaCommon/workspace/target/classes
07:16:42  [INFO] -------------------------------------------------------------
07:16:42  mojoFailed org.apache.maven.plugins:maven-compiler-plugin:2.3.2(default-compile)
07:16:42  [ERROR] COMPILATION ERROR : 
07:16:42  [INFO] -------------------------------------------------------------
07:16:42  [ERROR] /opt/jss/hudson/work/jobs/FMWJavaCommon/workspace/src/main/java/au/gov/qld/jag/jss/fusion/services/InvokeAuditLoggerService.java:[107,8] cannot find symbol
07:16:42  symbol  : method setGeneratedTimestamp(javax.xml.datatype.XMLGregorianCalendar)
07:16:42  location: class au.gov.qld.jag.jss.fusion.services.client.auditservice.AuditLogType
07:16:42  [INFO] 1 error
0

插件的pom配置如下:

            <!-- Compiler Version to use for Compiling Java Code -->
            <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

没有其他特殊配置。我正在使用Hudson 2.2.0-BETA和Hudson :: Maven(遗留)插件2.2.0-BETA。


错误并不总是发生。事实上,我已经有一段时间没有看到它了。 - tdrury

0

不确定这是否能解决您的问题,但我曾经遇到过完全相同的问题,因为父POM定义了编译器插件的插件定义。我将相同的插件定义复制到实际项目POM中。这为我解决了问题,即Jenkins现在正确显示编译器错误。不确定为什么这样做可以解决问题,但它确实有效。也许这与Maven分叉一个进程来编译子模块有关,而终端没有被传输到Jenkins控制台。我会在有时间时进行更多探索。

如果这对您有用,请告诉我。我已经复制了我的插件定义,它非常标准:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>
</plugins>

Usman,这是一个有趣的理论,但我无法轻易地测试它,因为我有400多个子模块,为每个子模块添加编译插件是不现实的。 - tdrury

-1
你应该检查 ActivityRuntimeType 类的位置。很可能它不在编译器的构建或类路径上。当你依赖的类在意外变化的依赖项中时,通常会发生这种情况。

代码库在两次运行中都是相同的。当从命令行构建时,我们得到了预期的错误。当通过Jenkins构建时,它仍然失败,但没有显示编译器错误输出。问题不在于ActivityRuntimeType出了什么问题,而是为什么Jenkins无法显示编译器输出。 - tdrury
我认为你无法从编译器这里获得更多信息。它只是无法找到该类/符号,关于此问题没有更多可以说的了。 - Faustas
重新阅读我的原始帖子 - 有两个 Maven 输出显示。第一个是从 Jenkins 运行的 Maven 输出 - 它显示了一个插件错误而不是编译器错误。第二个是从命令行运行 Maven,并显示期望的编译器错误。我并非在请求帮助调试代码 - 我想知道当在 Jenkins 中运行时 Maven 为什么不显示编译器错误。 - tdrury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接