Intermittent NoClassDefFoundError when running a maven/surefire build in jenkins Intermittent NoClassDefFoundError when running a maven/surefire build in jenkins jenkins jenkins

Intermittent NoClassDefFoundError when running a maven/surefire build in jenkins


Try running the maven build without the -T 4.

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

Edit:

Your problem is this dependency:

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

surefire-junit47 depends 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-junit47 library you're using, but if switching to surefire-junit4 is an option, then that should solve your problem.

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


Just try to use the surfire-junit4 in place of surfire-junit47 :

                <dependency>                    <groupId>org.apache.maven.surefire</groupId>                    <artifactId>surefire-junit4</artifactId>                    <version>${testing.surefire.version}</version>                </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

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.

Does this solve the problem ?


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

You should try to analyse surfire classpath by :

  • execute : mvn -X clean test
  • open file : target\surefire\surefire5942929663635698632tmp

You will see something like :

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

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

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

surfire-junit47 dependencies

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