2015-04-10 17 views
5

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?

Trả lời

0

tôi đã cùng một lỗi, nhưng thêm

`<testFailureIgnore>false</testFailureIgnore>` 

giải quyết vấn đề. Vì vậy, cấu hình tiếp theo sẽ giải quyết vấn đề.

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

Tôi gặp phải lỗi tương tự với dự án nhiều mô-đun. Bất cứ khi nào tôi thêm -Dcobertura.skip=true tôi nhận được các ngoại lệ NoClassDefFound và ClassNotFound.

Đáng tiếc là tôi không thể hiểu tại sao. Tôi đoán là, không phải mọi mục tiêu cobertura đều có tham số.

Tuy nhiên, tôi đã "giải quyết" sự cố bằng cách sử dụng hồ sơ. Tức là, tôi đã chuyển plugin cobertura từ cấu hình xây dựng mặc định sang cấu hình 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> 

Bất cứ khi nào tôi muốn cobertura chạy, tôi sử dụng -P cobertura-run thay vì tắt hoặc bật cobertura trong dòng lệnh.

Các vấn đề liên quan