当使用带有surefire和Cobertura的JUnit-Tests来构建我的项目以获得测试覆盖率时,通常情况下一切正常。但是当我最近添加了一个可以通过某些测试抛出(并且被排除在外)的异常时,maven总是告诉我:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project backend-server: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed: There was an error in the forked process
[ERROR] java.lang.NoClassDefFoundError: de/unileipzig/irpsim/backend/simulation/TimerowTooShortException
[ERROR] at java.lang.Class.getDeclaredMethods0(Native Method)
[ERROR] at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
[ERROR] at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
[ERROR] at java.lang.Class.getMethod0(Class.java:3018)
[ERROR] at java.lang.Class.getMethod(Class.java:1784)
[ERROR] at org.apache.maven.surefire.util.ReflectionUtils.tryGetMethod(ReflectionUtils.java:57)
[ERROR] at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.isSuiteOnly(JUnit3TestChecker.java:64)
[ERROR] at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.isValidJUnit3Test(JUnit3TestChecker.java:59)
[ERROR] at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.accept(JUnit3TestChecker.java:54)
[ERROR] at org.apache.maven.surefire.common.junit4.JUnit4TestChecker.accept(JUnit4TestChecker.java:52)
[ERROR] at org.apache.maven.surefire.util.DefaultScanResult.applyFilter(DefaultScanResult.java:97)
[ERROR] at org.apache.maven.surefire.junit4.JUnit4Provider.scanClassPath(JUnit4Provider.java:222)
[ERROR] at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:107)
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
[ERROR] Caused by: java.lang.ClassNotFoundException: de.unileipzig.irpsim.backend.simulation.TimerowTooShortException
[ERROR] at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[ERROR] at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[ERROR] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
[ERROR] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[ERROR] ... 16 more
[ERROR] -> [Help 1]
使用-X或类似的内容运行不幸没有帮助,而且查看http://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html或Intermittent NoClassDefFoundError when running a maven/surefire build in jenkins并没有提供任何有用的提示来解决此问题。
我的surefire-plugin定义如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<forkedProcessTimeoutInSeconds>900</forkedProcessTimeoutInSeconds>
<argLine>-Djava.library.path=${nativelib.directory}</argLine>
<excludes>
<exclude>**/DatabaseTest.java</exclude>
</excludes>
</configuration>
</plugin>
当停用分叉时,一切都开始正常工作,但不包括native-libs,所以这不是一个选项。此外,当我排除所有使用TimerowTooShortException
的测试时,一切正常。
经过一些尝试后,我发现即使用-Dcobertura.skip=true
运行测试,cobertura也会导致问题。 Cobertura在插件中的定义如下:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.6</version>
<configuration>
<formats>
<format>xml</format>
</formats>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>5.0.3</version>
</dependency>
</dependencies>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>cobertura</goal>
</goals>
</execution>
</executions>
</plugin>
不幸的是,在将surefire和cobertura与预期的异常一起使用时,我无法找到有关此特定问题的任何信息。有人知道为什么在使用cobertura时会发生这种情况?是否有解决方法?
答案 0 :(得分:3)
我在多模块项目中遇到了类似的错误。每当我添加-Dcobertura.skip=true
时,我都会获得NoClassDefFound和ClassNotFound Exceptions。
不幸的是我无法弄明白为什么。我的猜测是,不是每个cobertura目标都采用参数。
但是,我已经解决了#34;使用配置文件的问题。也就是说,我将cobertura插件从默认构建配置移动到cobertura配置文件。
<profiles>
<profile>
<id>cobertura-run</id>
<properties>
<maven.test.skip>false</maven.test.skip>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<formats>
<format>xml</format>
</formats>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>cobertura</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
每当我想要cobertura运行时,我使用-P cobertura-run
而不是在命令行中禁用或启用cobertura。
答案 1 :(得分:2)
关于它的问题有一个开放的cobertura问题https://github.com/mojohaus/cobertura-maven-plugin/issues/8
答案 2 :(得分:0)
我有同样的错误,但添加了
`<testFailureIgnore>false</testFailureIgnore>`
解决问题。
所以下一个配置应该解决问题。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skipTests>${skipTests}</skipTests>
<testFailureIgnore>false</testFailureIgnore>
<includes>
<include>**/*.java</include>
</includes>
</configuration>
</plugin>