java 在 jenkins 中运行 maven/surefire 构建时出现间歇性 NoClassDefFoundError

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27225140/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 11:26:22  来源:igfitidea点击:

Intermittent NoClassDefFoundError when running a maven/surefire build in jenkins

javamavenjunitjenkinssurefire

提问by Nitzan Volman

We are building a large multi module Maven project on Jenkins, including running a large number of unit test.

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

Once every few builds the build fails on NoClassDefFoundError on RunListener- which is located in the unit jar. As you can see from the log below - JUnit is included in the classpath.

每隔几次构建,​​构建就会失败NoClassDefFoundError on RunListener- 它位于单元 jar 中。正如您从下面的日志中看到的那样 - JUnit 包含在类路径中。

The error seems to appear completely at random.

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

Log

日志

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.call(LifecycleThreadedBuilder.java:167)
    at org.apache.maven.lifecycle.internal.LifecycleThreadedBuilder.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
clean install -P FastTests -DIsBuildSystem=1 -T 4 -X -e
0(URLClassLoader.java:58) at java.net.URLClassLoader.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
....

        <!-- Generic tests plugin for maven -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${testing.surefire.version}</version>
            <configuration>

                <systemPropertyVariables>
                    <startPortForDebug>${startPortForDebug}</startPortForDebug>
                    <surefireForkNumber>fork_${surefire.forkNumber}</surefireForkNumber>
                    <geoip.db.dir>${basedir}/../framework/target/</geoip.db.dir>
                    <java.awt.headless>true</java.awt.headless>
                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
                </systemPropertyVariables>



                <!-- Use new JVM for each test -->
                <parallel>classes</parallel>

                <threadCount>1</threadCount>
                <forkCount>${testing.forkCount}</forkCount>
                <reuseForks>${testing.reuseFork}</reuseForks>
                <useSystemClassLoader>${testing.useSystemClassLoader}</useSystemClassLoader>
                <useManifestOnlyJar>${testing.useManifestOnlyJar}</useManifestOnlyJar>

                <!-- Display extra information on exception prints -->
                <useFile>true</useFile>
                <redirectTestOutputToFile>true</redirectTestOutputToFile>
                <runOrder>alphabetical</runOrder>

                <!-- Display extra information on exception prints -->
                <useFile>false</useFile>

                <!-- -->
                <forkedProcessTimeoutInSeconds>300</forkedProcessTimeoutInSeconds>


                <argLine>-XX:PermSize=128m -XX:MaxPermSize=512m -DIsBuildSystem=${is.build.system}</argLine>

            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>${testing.surefire.version}</version>
                </dependency>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>${junit.version}</version>
                </dependency>
            </dependencies>

        </plugin>

....
        <profile>
            <id>FastTests</id>
            <properties>
                <testing.forkCount>0.5C</testing.forkCount>
                <testing.reuseFork>false</testing.reuseFork>
                <testing.useSystemClassLoader>true</testing.useSystemClassLoader>
                <testing.useManifestOnlyJar>false</testing.useManifestOnlyJar>
            </properties>
        </profile>
0(URLClassLoader.java:58) at java.net.URLClassLoader.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.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 <goals> -rf :taboola-svc


More Info

更多信息

  • The build is running on a slave
  • Jenkins ver. 1.565.2
  • Tried with both maven 3.0.4, and 3.1.1
  • Tried with surefire 2.16, 17 & 18
  • Tried with junit 4.10 & 4.11
  • 构建正在从属设备上运行
  • 詹金斯版。1.565.2
  • 尝试使用 Maven 3.0.4 和 3.1.1
  • 尝试过万无一失的 2.16、17 和 18
  • 与 junit 4.10 和 4.11 一起尝试


I have verified the SHA1 of JUnit jar in the Maven repository and made sure the jar file is not corrupted.

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



Command line

命令行

(defined in a jenkins job)

(在詹金斯工作中定义)

        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>${testing.surefire.version}</version>
        </dependency>


Relevant parts from the parent pom.xml

来自父 pom.xml 的相关部分

The project itself is a multi module pom project, with the parent pom defining the surefire definitions as attached.

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

                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit4</artifactId>
                    <version>${testing.surefire.version}</version>
                </dependency>

回答by Foxsly

Try running the maven build without the -T 4.

尝试在没有-T 4.

The parallel buildsfeature in Maven 3 is still in the experimental stages, and it appears that there are known issues with thread safety in the plexus-utilslibrary prior to version 2.0.5 - you're using version 1.5.1.

Maven 3 中的并行构建功能仍处于试验阶段,似乎在plexus-utils2.0.5 版之前的库中存在线程安全性已知问题- 您使用的是 1.5.1 版。

Edit:

编辑:

Your problem is this dependency:

你的问题是这种依赖:

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

surefire-junit47depends on maven-surefire-common, which in turn depends on maven-artifact, which depends on plexus-utils-1.5.1. As stated above, this has known thread safety issues, which is likely what is causing your problems. I'm not sure what parts of the surefire-junit47library you're using, but if switching to surefire-junit4is an option, then that should solve your problem.

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

After looking at the docs for the surefire plugin a little more, it looks like you need the surefire-junit47provider to run parallel tests. I'd try overriding plexus-utilsto be version 2.0.5 and see if that works; otherwise, you can override the maven-artifactversion to 3.0.3 or higher and see if that works.

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

回答by Donatello

Just try to use the surfire-junit4in place of surfire-junit47:

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

                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.17</version>
                    <exclusions>
                        <exclusion>
                            <groupId>org.apache.maven.surfire</groupId>
                            <artifactId>common-junit3</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>

It will change classpath/runtime behavior, as it comes with less dependencies :

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

enter image description here

在此处输入图片说明

You may also try to completely remove this dependency as it's not required for parallel support :

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

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

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

As of Surefire 2.7, no additional dependencies are needed to use the full set of options with parallel.As of Surefire 2.16, new thread-count attributes are introduced, namely threadCountSuites, threadCountClasses and threadCountMethods. Additionally, the new attributes parallelTestsTimeoutInSeconds and parallelTestsTimeoutForcedInSeconds are used to shut down the parallel execution after an elapsed timeout, and the attribute parallel specifies new values.

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

Does this solve the problem ?

这能解决问题吗?

回答by Donatello

It seems you have a random classloading issue.

您似乎有一个随机类加载问题。

The missing class appears since JUnit 4 : http://findjar.com/class/org/junit/runner/notification/RunListener.html

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

You should try to analyse surfire classpath by :

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

  • execute : mvn -X clean test
  • open file : target\surefire\surefire5942929663635698632tmp
  • 执行:mvn -X 清洁测试
  • 打开文件:target\surefire\surefire5942929663635698632tmp

You will see something like :

你会看到类似的东西:

##代码##

Try to ensure JUnit 3.x -and related jars- are not loaded.

尝试确保未加载 JUnit 3.x 和相关 jar。

For example, you may try to exclude common-junit3 from surfire-junit47 :

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

surfire-junit47 dependencies

surfire-junit47 依赖项

##代码##

回答by RichW

If all your builds use the same workspace, and if its possible for several builds to run concurrently or overlap in any way, it's possible that the "clean" action is wiping out required build artifacts while another build is trying to use them.

如果您的所有构建都使用相同的工作空间,并且如果多个构建可能同时运行或以任何方式重叠,则“清理”操作可能正在清除所需的构建工件,而另一个构建正在尝试使用它们。

If that's what's happening, the fix would be to have each build run use its own workspace.

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