在jenkins中运行maven / surefire构建时间歇性的NoClassDefFoundError

我们正在Jenkins上构建一个大型的多模块Maven项目,包括运行大量的unit testing。

每运行一次,构建就会在NoClassDefFoundError on RunListener上的NoClassDefFoundError on RunListener – 它位于单元jar中。 从下面的日志中可以看出 – JUnit包含在类路径中。

该错误似乎完全随机出现。

日志

 Waiting for Jenkins to finish collecting data [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test (default-test) on project taboola-svc: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test failed: A required class was missing while executing org.apache.maven.plugins:maven-surefire-plugin:2.17:test: org/junit/runner/notification/RunListener [ERROR] ----------------------------------------------------- [ERROR] realm = plugin>org.apache.maven.plugins:maven-surefire-plugin:2.17 [ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy [ERROR] urls[0] = file:/home/builder/.m2/repository/org/apache/maven/plugins/maven-surefire-plugin/2.17/maven-surefire-plugin-2.17.jar [ERROR] urls[1] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-junit47/2.17/surefire-junit47-2.17.jar [ERROR] urls[2] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit48/2.17/common-junit48-2.17.jar [ERROR] urls[3] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit4/2.17/common-junit4-2.17.jar [ERROR] urls[4] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit3/2.17/common-junit3-2.17.jar [ERROR] urls[5] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-grouper/2.17/surefire-grouper-2.17.jar [ERROR] urls[6] = file:/home/builder/.m2/repository/org/apache/maven/shared/maven-shared-utils/0.4/maven-shared-utils-0.4.jar [ERROR] urls[7] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-java5/2.17/common-java5-2.17.jar [ERROR] urls[8] = file:/home/builder/.m2/repository/junit/junit/4.11/junit-4.11.jar [ERROR] urls[9] = file:/home/builder/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar [ERROR] urls[10] = file:/home/builder/.m2/repository/org/apache/maven/surefire/maven-surefire-common/2.17/maven-surefire-common-2.17.jar [ERROR] urls[11] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-booter/2.17/surefire-booter-2.17.jar [ERROR] urls[12] = file:/home/builder/.m2/repository/org/codehaus/plexus/plexus-utils/1.5.1/plexus-utils-1.5.1.jar [ERROR] urls[13] = file:/home/builder/.m2/repository/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.jar [ERROR] urls[14] = file:/home/builder/.m2/repository/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar [ERROR] urls[15] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-api/2.17/surefire-api-2.17.jar [ERROR] urls[16] = file:/home/builder/.m2/repository/org/apache/maven/plugin-tools/maven-plugin-annotations/3.2/maven-plugin-annotations-3.2.jar [ERROR] Number of foreign imports: 1 [ERROR] import: Entry[import from realm ClassRealm[maven.api, parent: null]] [ERROR] [ERROR] -----------------------------------------------------: org.junit.runner.notification.RunListener [ERROR] -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test (default-test) on project taboola-svc: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test failed: A required class was missing while executing org.apache.maven.plugins:maven-surefire-plugin:2.17:test: org/junit/runner/notification/RunListener ----------------------------------------------------- realm = plugin>org.apache.maven.plugins:maven-surefire-plugin:2.17 strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy urls[0] = file:/home/builder/.m2/repository/org/apache/maven/plugins/maven-surefire-plugin/2.17/maven-surefire-plugin-2.17.jar urls[1] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-junit47/2.17/surefire-junit47-2.17.jar urls[2] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit48/2.17/common-junit48-2.17.jar urls[3] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit4/2.17/common-junit4-2.17.jar urls[4] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit3/2.17/common-junit3-2.17.jar urls[5] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-grouper/2.17/surefire-grouper-2.17.jar urls[6] = file:/home/builder/.m2/repository/org/apache/maven/shared/maven-shared-utils/0.4/maven-shared-utils-0.4.jar urls[7] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-java5/2.17/common-java5-2.17.jar urls[8] = file:/home/builder/.m2/repository/junit/junit/4.11/junit-4.11.jar urls[9] = file:/home/builder/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar urls[10] = file:/home/builder/.m2/repository/org/apache/maven/surefire/maven-surefire-common/2.17/maven-surefire-common-2.17.jar urls[11] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-booter/2.17/surefire-booter-2.17.jar urls[12] = file:/home/builder/.m2/repository/org/codehaus/plexus/plexus-utils/1.5.1/plexus-utils-1.5.1.jar urls[13] = file:/home/builder/.m2/repository/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.jar urls[14] = file:/home/builder/.m2/repository/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar urls[15] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-api/2.17/surefire-api-2.17.jar urls[16] = file:/home/builder/.m2/repository/org/apache/maven/plugin-tools/maven-plugin-annotations/3.2/maven-plugin-annotations-3.2.jar Number of foreign imports: 1 import: Entry[import from realm ClassRealm[maven.api, parent: null]] ----------------------------------------------------- at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:225) 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.LifecycleThreadedBuilder$1.call(LifecycleThreadedBuilder.java:167) at org.apache.maven.lifecycle.internal.LifecycleThreadedBuilder$1.call(LifecycleThreadedBuilder.java:163) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:662) Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test failed: A required class was missing while executing org.apache.maven.plugins:maven-surefire-plugin:2.17:test: org/junit/runner/notification/RunListener ----------------------------------------------------- realm = plugin>org.apache.maven.plugins:maven-surefire-plugin:2.17 strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy urls[0] = file:/home/builder/.m2/repository/org/apache/maven/plugins/maven-surefire-plugin/2.17/maven-surefire-plugin-2.17.jar urls[1] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-junit47/2.17/surefire-junit47-2.17.jar urls[2] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit48/2.17/common-junit48-2.17.jar urls[3] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit4/2.17/common-junit4-2.17.jar urls[4] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit3/2.17/common-junit3-2.17.jar urls[5] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-grouper/2.17/surefire-grouper-2.17.jar urls[6] = file:/home/builder/.m2/repository/org/apache/maven/shared/maven-shared-utils/0.4/maven-shared-utils-0.4.jar urls[7] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-java5/2.17/common-java5-2.17.jar urls[8] = file:/home/builder/.m2/repository/junit/junit/4.11/junit-4.11.jar urls[9] = file:/home/builder/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar urls[10] = file:/home/builder/.m2/repository/org/apache/maven/surefire/maven-surefire-common/2.17/maven-surefire-common-2.17.jar urls[11] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-booter/2.17/surefire-booter-2.17.jar urls[12] = file:/home/builder/.m2/repository/org/codehaus/plexus/plexus-utils/1.5.1/plexus-utils-1.5.1.jar urls[13] = file:/home/builder/.m2/repository/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.jar urls[14] = file:/home/builder/.m2/repository/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar urls[15] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-api/2.17/surefire-api-2.17.jar urls[16] = file:/home/builder/.m2/repository/org/apache/maven/plugin-tools/maven-plugin-annotations/3.2/maven-plugin-annotations-3.2.jar Number of foreign imports: 1 import: Entry[import from realm ClassRealm[maven.api, parent: null]] ----------------------------------------------------- at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:127) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) ... 13 more Caused by: org.apache.maven.plugin.PluginContainerException: A required class was missing while executing org.apache.maven.plugins:maven-surefire-plugin:2.17:test: org/junit/runner/notification/RunListener ----------------------------------------------------- realm = plugin>org.apache.maven.plugins:maven-surefire-plugin:2.17 strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy urls[0] = file:/home/builder/.m2/repository/org/apache/maven/plugins/maven-surefire-plugin/2.17/maven-surefire-plugin-2.17.jar urls[1] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-junit47/2.17/surefire-junit47-2.17.jar urls[2] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit48/2.17/common-junit48-2.17.jar urls[3] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit4/2.17/common-junit4-2.17.jar urls[4] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-junit3/2.17/common-junit3-2.17.jar urls[5] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-grouper/2.17/surefire-grouper-2.17.jar urls[6] = file:/home/builder/.m2/repository/org/apache/maven/shared/maven-shared-utils/0.4/maven-shared-utils-0.4.jar urls[7] = file:/home/builder/.m2/repository/org/apache/maven/surefire/common-java5/2.17/common-java5-2.17.jar urls[8] = file:/home/builder/.m2/repository/junit/junit/4.11/junit-4.11.jar urls[9] = file:/home/builder/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar urls[10] = file:/home/builder/.m2/repository/org/apache/maven/surefire/maven-surefire-common/2.17/maven-surefire-common-2.17.jar urls[11] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-booter/2.17/surefire-booter-2.17.jar urls[12] = file:/home/builder/.m2/repository/org/codehaus/plexus/plexus-utils/1.5.1/plexus-utils-1.5.1.jar urls[13] = file:/home/builder/.m2/repository/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.jar urls[14] = file:/home/builder/.m2/repository/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar urls[15] = file:/home/builder/.m2/repository/org/apache/maven/surefire/surefire-api/2.17/surefire-api-2.17.jar urls[16] = file:/home/builder/.m2/repository/org/apache/maven/plugin-tools/maven-plugin-annotations/3.2/maven-plugin-annotations-3.2.jar Number of foreign imports: 1 import: Entry[import from realm ClassRealm[maven.api, parent: null]] ----------------------------------------------------- at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:125) ... 14 more Caused by: java.lang.NoClassDefFoundError: org/junit/runner/notification/RunListener at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at org.apache.maven.surefire.booter.IsolatedClassLoader.loadClass(IsolatedClassLoader.java:97) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at org.apache.maven.surefire.booter.IsolatedClassLoader.loadClass(IsolatedClassLoader.java:97) at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2398) at java.lang.Class.getConstructor0(Class.java:2708) at java.lang.Class.getConstructor(Class.java:1659) at org.apache.maven.surefire.util.ReflectionUtils.getConstructor(ReflectionUtils.java:76) at org.apache.maven.surefire.util.ReflectionUtils.instantiateOneArg(ReflectionUtils.java:129) at org.apache.maven.surefire.booter.SurefireReflector.instantiateProvider(SurefireReflector.java:235) at org.apache.maven.surefire.booter.ProviderFactory.createProvider(ProviderFactory.java:113) at org.apache.maven.plugin.surefire.booterclient.ForkStarter.getSuitesIterator(ForkStarter.java:512) at org.apache.maven.plugin.surefire.booterclient.ForkStarter.runSuitesForkPerTestSet(ForkStarter.java:277) at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:169) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:967) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:831) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:729) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) ... 14 more Caused by: java.lang.ClassNotFoundException: org.junit.runner.notification.RunListener at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at org.apache.maven.surefire.booter.IsolatedClassLoader.loadClass(IsolatedClassLoader.java:97) ... 53 more [ERROR] [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/PluginContainerException [ERROR] [ERROR] After correcting the problems, you can resume the build with the command [ERROR] mvn  -rf :taboola-svc 

更多信息

  • 构建在从属服务器上运行
  • jenkins诉。 1.565.2
  • 尝试使用maven 3.0.4和3.1.1
  • 与surefire 2.16,17和18一起尝试
  • 尝试使用junit 4.10和4.11

我已经在Maven存储库中validation了JUnit jar的SHA1,并确保jar文件没有损坏。


命令行

(在jenkins工作中定义)

 clean install -P FastTests -DIsBuildSystem=1 -T 4 -X -e 

来自父pom.xml的相关部分

项目本身是一个多模块pom项目,父pom定义了附加的万无一失的定义。

 ....   org.apache.maven.plugins maven-surefire-plugin ${testing.surefire.version}   ${startPortForDebug} fork_${surefire.forkNumber} ${basedir}/../framework/target/ true true   classes 1 ${testing.forkCount} ${testing.reuseFork} ${testing.useSystemClassLoader} ${testing.useManifestOnlyJar}  true true alphabetical  false  300 -XX:PermSize=128m -XX:MaxPermSize=512m -DIsBuildSystem=${is.build.system}    org.apache.maven.surefire surefire-junit47 ${testing.surefire.version}   junit junit ${junit.version}    ....  FastTests  0.5C false true false   

尝试在没有-T 4情况下运行maven构建。

Maven 3中的并行构建function仍处于试验阶段,似乎在版本2.0.5之前的plexus-utils库中存在已知的线程安全问题 – 您使用的是1.5.1版本。

编辑:

你的问题是这种依赖:

   org.apache.maven.surefire surefire-junit47 ${testing.surefire.version}  

surefire-junit47依赖于maven-surefire-common surefire-junit47 maven-surefire-common ,而后者依赖于maven-artifact ,这取决于plexus-utils-1.5.1 。 如上所述,这有已知的线程安全问题,这可能是导致问题的原因。 我不确定你正在使用surefire-junit47库的哪些部分,但如果切换到surefire-junit4是一个选项,那么这应该可以解决你的问题。

在查看了surefire插件的文档之后,看起来您需要surefire-junit47提供程序来运行并行测试。 我会尝试重写plexus-utils为2.0.5版,看看是否有效; 否则,您可以将maven-artifact版本覆盖到3.0.3或更高版本,看看是否有效。

只是尝试使用surfire-junit4代替surfire-junit47

   org.apache.maven.surefire surefire-junit4 ${testing.surefire.version}  

它将改变类路径/运行时行为,因为它具有较少的依赖性:

在此处输入图像描述

您也可以尝试完全删除此依赖项,因为并行支持不需要它:

http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html

从Surefire 2.7开始,使用并行的全套选项不需要额外的依赖关系。 从Surefire 2.16开始,引入了新的线程计数属性,即threadCountSuites,threadCountClasses和threadCountMethods。 此外,新属性parallelTestsTimeoutInSeconds和parallelTestsTimeoutForcedInSeconds用于在经过超时后关闭并行执行,并且属性parallel指定新值。

这会解决问题吗?

看来你有一个随机的类加载问题。

从JUnit 4开始出现缺少的类: http : //findjar.com/class/org/junit/runner/notification/RunListener.html

您应该尝试通过以下方式分析surfire类路径:

  • 执行:mvn -X clean test
  • 打开文件:target \ surefire \ surefire5942929663635698632tmp

你会看到类似的东西:

 surefireClassPathUrl.0=D\:\\maven2\\repository\\org\\apache\\maven\\surefire\\surefire-junit47\\2.17\\surefire-junit47-2.17.jar surefireClassPathUrl.1=D\:\\maven2\\repository\\org\\apache\\maven\\surefire\\common-junit48\\2.17\\common-junit48-2.17.jar surefireClassPathUrl.2=D\:\\maven2\\repository\\org\\apache\\maven\\surefire\\common-junit4\\2.17\\common-junit4-2.17.jar surefireClassPathUrl.3=D\:\\maven2\\repository\\org\\apache\\maven\\surefire\\common-junit3\\2.17\\common-junit3-2.17.jar surefireClassPathUrl.4=D\:\\maven2\\repository\\org\\apache\\maven\\surefire\\surefire-api\\2.17\\surefire-api-2.17.jar surefireClassPathUrl.5=D\:\\maven2\\repository\\org\\apache\\maven\\surefire\\common-java5\\2.17\\common-java5-2.17.jar surefireClassPathUrl.6=D\:\\maven2\\repository\\org\\apache\\maven\\shared\\maven-shared-utils\\0.4\\maven-shared-utils-0.4.jar surefireClassPathUrl.7=D\:\\maven2\\repository\\com\\google\\code\\findbugs\\jsr305\\2.0.1\\jsr305-2.0.1.jar surefireClassPathUrl.8=D\:\\maven2\\repository\\org\\apache\\maven\\surefire\\surefire-grouper\\2.17\\surefire-grouper-2.17.jar 

尽量确保未加载JUnit 3.x及相关的jar文件。

例如,您可以尝试从surfire-junit47中排除common-junit3:

surfire-junit47依赖

   org.apache.maven.surefire surefire-junit47 2.17   org.apache.maven.surfire common-junit3    

如果所有构建都使用相同的工作区,并且如果多个构建可以同时运行或以任何方式重叠,那么“干净”操作可能会消除所需的构建工件,而另一个构建正在尝试使用它们。

如果发生了这种情况,修复方法是让每个构建运行使用自己的工作区。