Khi xây dựng dự án của tôi với maven bằng cách sử dụng JUnit-Tests với chắc chắn và Cobertura để có được vùng phủ sóng thử nghiệm, thông thường, mọi thứ hoạt động tốt. Nhưng khi tôi vừa thêm một ngoại lệ có thể được ném (và được trừ) bởi một số xét nghiệm, maven luôn nói với tôi:Cobertura gây ra ClassNotFoundException
[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]
Một chạy với -X hoặc những thứ như thế này tiếc là đã không giúp đỡ, và cũng có thể nhìn vào http://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html hoặc Intermittent NoClassDefFoundError when running a maven/surefire build in jenkins không cung cấp bất kỳ gợi ý hữu ích nào cho vấn đề này.
chắc chắn hơn-plugin của tôi được định nghĩa như sau:
<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>
Khi Tăt forking, mọi thứ bắt đầu làm việc tốt, nhưng các bản địa-libs không được tính, vì vậy đây không phải là một lựa chọn. Ngoài ra, khi tôi loại trừ tất cả các thử nghiệm sử dụng TimerowTooShortException
, mọi thứ đều hoạt động tốt.
Sau một số lần thử, tôi phát hiện ra rằng cobertura, ngay cả khi thử nghiệm được chạy với -Dcobertura.skip=true
, đang gây ra sự cố. Cobertura được định nghĩa trong các plugin như sau:
<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>
Thật không may tôi không thể tìm thấy bất kỳ thông tin nào về vấn đề cụ thể khi sử dụng chắc chắn và cobertura cùng với ngoại lệ dự kiến. Có ai biết tại sao điều này xảy ra khi sử dụng cobertura? Và có cách giải quyết nào cho vấn đề này không?