Jenkins没有显示maven编译器错误

在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  -rf :me.activity.impl 

我们将maven-3.0.4用于本地构建和Jenkins。 jenkins版本是1.3ish,但我升级到1.450,看看问题是否会消失 – 事实并非如此。 这发生在我们从maven-2.2.1转移到maven-3.0.4的时候,但是我可以发誓(虽然我没有证据)我在Jenven升级之后就得到了正常的构建错误,所以我不要以为就是这样,但这是我能想到的唯一一个会导致这种变化的变化。 编译器插件版本是2.0.2。

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

得到答案,这可能对你不起作用,因为它似乎依赖于许多事物和情况, 我怀疑这对大多数人来说确实相关。


故障排除

(如果你不关心我如何解决这个问题,请跳过我的设置,但它可能对你有所帮助。如果你不耐烦, 解决方案1位是你想要的。)

怎么开始……

一个积极开发的项目的当前工作目录开始吐出日志,显示今天这种行为,一段时间没有错误。 我使用的是Windows 7,Maven 3.0.4,编译器插件2.4和java(c)1.6.0_31。

当到达特定的子模块时,maven会吐出一些错误消息并使构建失败,除了错误消息不相关(报告使用专有的com.sun.* API)并且没有实际编译错误的迹象。

事情变得怪异……

此时我发现了这个post,我也尝试用不同的java版本和maven-compiler-plugin版本重新构建。 这是有趣的部分:

  • 使用compiler-plugin 2.5,我会遇到类似的问题,并且没有有效的错误报告;
  • 使用编译器插件2.3,我会得到一个类似的问题,一个无意义的错误报告抱怨丢失的包 (虽然存在,但在类路径中!) ;
  • 使用编译器插件2.3.2,我会得到一个类似的问题,一个无意义的错误报告抱怨丢失的包 (现在和类路径上存在!) 但是**在测试类的不同点**模块的编译 (以前它发生在正常类的编译期间)。

从奇怪到怪异

出于疑问,我切换到另一个目录,干净地检查项目并重新构建了所有内容。

一切都很精细 。 困惑和绝望在这里。

所以我意识到我正在另一个工作区中的一个相当庞大复杂的类中,在故障模块中。 我的意思是相当庞大,复杂,写得相当糟糕。 让你告诉你的老板的野兽类型“请不要让我触摸这个”,这使得你的DELETE键每当你在IDE中遇到不幸的时候都会发痒。 事实上,这个东西看起来非常像一个黑暗的margic实验的后代和奇怪的不道德的生物研究,你想知道它是不是来自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只是在没有通知的情况下崩溃,并且在日志管理中出现了问题并且它没有被正确地冲洗掉。

这也可以解释为什么这个错误相对随机发生:它会受到你的硬件设置的影响,并且javac类的细微变化会被赋予进程。

那么现在怎么办??? 好吧,如果有一个疯狂的堆栈溢出exception或者当java试图处理你的代码时出现OutOfMemoryException,显然你需要做一些类似于下面解释的内容……


解决方案

解决方案1(又名“短期/快速n-dirty / please-make-it-work”)

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

 export MAVEN_OPTS="-Xss1024k -Xms512m -Xmx1024m" 

请注意 :这些设置显然取决于您平台的硬件(在您的shell上)。

在我的情况下,我实际上曾经有过:

 export MAVEN_OPTS="-Xss128k -Xms384m -Xmx384m" 

…因为我有一个非常繁重的项目和一个不那么具有内存function的工作站,所以我需要从中挤出所有RAM,以便运行多个Eclipse实例,多个应用程序服务器等…所以我的JAVA_OPTS,ANT_OPTS和MAVEN_OPTS设置了一堆选项,包括这些选项。

这不一定是你想要的!! Windows上64位JVM的默认xss实际上是1024,所以我使用的东西要小得多。 我只是说它,因为它可能在同样的情况下帮助其他人。 尝试相应地提高它并明智地为您配置。

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

 export MAVEN_OPTS="-Xss256k -Xms384m -Xmx384m" 

现在一切都很好用。

也许其他一些事情对你来说是不同的。 让我知道。

解决方案2(又名“长期/禅”)

你知道什么比摆弄其他人不会知道的内存设置更好,可能没有机会,这会让你的构建变得不那么便携? [观众在这里尖叫]

你重新构思了那个让javac为妈妈哭泣的那个丑陋的课堂

就这么简单。 没有数千和数千行长类,有疯狂的静态初始化器,超长的方法和类似的东西。 如果您的代码看起来很复杂,那么对于糟糕的javac来说肯定也是如此。

今天保存一个javac进程:重构你的代码!

我使用的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配置是

    true org.apache.maven.plugins maven-compiler-plugin 2.3.2  1.6 1.6   

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

不确定这是否能解决您的问题,但我有完全相同的问题,因为父pom有编译器插件的插件定义。 我将相同的插件定义复制到实际的项目pom中。 这解决了我的问题,即Jenkins现在正确显示编译器错误。 不知道为什么这解决了问题,但确实如此。 也许它与maven分配一个进程来编译子模块这个事实有关,而且该终端没有通过管道连接到jenkins控制台。 当我有时间时,我会探索更多。

如果这对您有用,请告诉我。 我已将我的插件定义复制到其相当标准的下方:

   org.apache.maven.plugins maven-compiler-plugin 2.5.1  1.6 1.6    

您应该检查ActivityRuntimeType类的位置。 很可能它不在编译器的构建或类路径上。 当您依赖的类处于exception更改的依赖项中时,通常会发生这种情况。