【问题标题】:Intermittent NoClassDefFoundError when running a maven/surefire build in jenkins在詹金斯中运行 maven/surefire 构建时出现间歇性 NoClassDefFoundError
【发布时间】:2015-01-29 06:23:42
【问题描述】:

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

每隔几次构建就会在 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 <goals> -rf :taboola-svc

更多信息

  • 构建正在从属设备上运行
  • 詹金斯版本。 1.565.2
  • 在 maven 3.0.4 和 3.1.1 上都试过
  • 已尝试使用 surefire 2.16、17 和 18
  • 尝试使用junit 4.10 & 4.11

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


命令行

(在詹金斯工作中定义)

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

父 pom.xml 中的相关部分

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

....

        <!-- 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>

【问题讨论】:

  • 如果你能包含你的 pom.xml 和你让 jenkins 运行的命令行,那就太棒了;)
  • @Vogel612 谢谢,添加了maven的命令行,并粘贴了pom.xml中的相关代码。
  • 你试过最新的Maven吗?我认为它现在达到了3.2.3。另外 - 如果你单独运行 Maven 而没有 Jenkins 会发生什么? Jenkins 项目是 Freestyle 项目还是 Maven?
  • 在此之前关于 sockpuppetry 指控的免责声明:Nitzan 是我的同事。

标签: java maven junit jenkins surefire


【解决方案1】:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>                 
                <dependencies>
                  <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>3.0.0-M5</version>
                  </dependency>
                </dependencies>
                <configuration>
                    <parallel>suites</parallel>                     
                    <threadCount>10</threadCount>
                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
                    <forkCount>3</forkCount>
                    <reuseForks>true</reuseForks>                       
                    <argLine>-Xms1536m -Xmx1536m</argLine>
                    <workingDirectory>${project.build.directory}/${surefire.forkNumber}</workingDirectory>
                    <useSystemClassLoader>true</useSystemClassLoader>
                    <useManifestOnlyJar>false</useManifestOnlyJar>
                    <rerunFailingTestsCount>2</rerunFailingTestsCount>
                    <shutdown>exit</shutdown>
                </configuration>                    
            </plugin>

【讨论】:

  • 此配置帮助我们将集成测试执行时间减少了 33%。配置中线程 10 的数量乘以 no。 CPU 的核心数,我们用 2 核 CPU 和 12 GB RAM 对其进行了测试,更多的是没有。 CPU 内核和支持它的良好 RAM 的数量越大,测试执行时间就越短。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    从 Surefire 2.7 开始,无需其他依赖项即可使用 完整的并行选项。 从 Surefire 2.16 开始,新 引入thread-count属性,即threadCountSuites, 线程计数类和线程计数方法。此外,新 属性 parallelTestsTimeoutInSeconds 和 parallelTestsTimeoutForcedInSeconds 用于关闭并行 超时后执行,并且属性并行 指定新值。

    这能解决问题吗?

    【讨论】:

      【解决方案4】:

      您似乎遇到了随机类加载问题。

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

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

      • 执行:mvn -X clean test
      • 打开文件:目标\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 和相关 jars。

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

                      <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>
      

      【讨论】:

        【解决方案5】:

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

        Maven 3 中的parallel builds 功能仍处于试验阶段,在 2.0.5 版本之前的plexus-utils 库中似乎存在已知的线程安全问题 - 您使用的是 1.5.1 版本.

        编辑:

        你的问题是这个依赖:

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

        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 或更高版本,看看是否可行。

        【讨论】:

        • -T 选项非常重要(并且节省了大约 50% 的构建时间),我正在寻找一种在启用并行选项的情况下运行它的方法,或者证明这是不可能的.
        • 你试过在没有并行选项的情况下运行它吗?弄清楚它之前失败的频率(每 5 次运行?每 10 次?),然后尝试在没有并行选项的情况下多次运行它。这可能需要一些时间,但如果您在没有问题的情况下运行它后没有遇到问题,我会很乐意称其为原因。此外,如果将4 降低到32,您可能会得到更好的结果 - 同时运行的线程越少,出现线程并发问题的可能性就越小。
        • 我在没有并行选项的情况下尝试过它并没有失败 - 问题可能与 -T 选项有关;这并不意味着在仍然使用 much 更快的并行选项时没有办法克服。正如我所提到的,我想要一种实现 WITH 并行的方法,或者证明这是不可能的。
        • 尝试升级到 maven surefire 2.6 - 我的答案中的链接表明这是surefire的线程安全版本。
        • 尝试使用 surefire 2.16,17 和 18 运行它。所有这些都应包含 2.6 中的线程安全修复。
        猜你喜欢
        • 2014-05-31
        • 1970-01-01
        • 2018-09-13
        • 2018-04-08
        • 2014-09-19
        • 2022-01-26
        • 2012-08-19
        • 2012-08-18
        • 2014-08-27
        相关资源
        最近更新 更多