2014-12-19 84 views
4

我有一個測試類ProcessorTest與線詹金斯的Cobertura建設 - NoClassDefFoundError的

JSONObject jsonObj = XML.toJSONObject(convert); 
DBOb = (DBObject) JSON.parse(jsonObj.toString()); 

XML類是從json.org。這個類在代碼中沒有問題的地方使用。

本地主機上的所有東西都運行正常(即所有的Maven和JUnit測試都執行)。

當我推到詹金斯我得到這個錯誤:

詹金斯錯誤

Error Details 
net/sourceforge/cobertura/coveragedata/TouchCollector 

Stack Trace 
java.lang.NoClassDefFoundError: net/sourceforge/cobertura/coveragedata/TouchCollector 
    at org.json.XML.__cobertura_init(XML.java) 
    at org.json.XML.<clinit>(XML.java) 
    at ProcessorTest.classSetup(ProcessorTest.java:81) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) 
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 
Caused by: java.lang.ClassNotFoundException: net.sourceforge.cobertura.coveragedata.TouchCollector 
    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 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    ... 26 more 

我使用詹金斯1.553和插件的Cobertura 1.9.6。

我該如何解決這個問題?

這個項目的結構是這樣的:

-- project1 
    | 
    | - core 
    | - Tests (includes the tests that fail) 


-- org.json 
    | 
    | - XML.class 

當推到詹金斯我承擔org.json項目是測試不可用。

回答

0

這個奇怪的行爲也可能與您的Jenkins構建機器上的不同Maven版本相比,您在本地使用。在您的pom.xml中使用的cobertura-maven-plugin版本也是您感興趣的。

純粹的Cobertura library本身(與您項目的maven插件捆綁在一起)使用了一堆依賴,這可能與Jenkins環境的Cobertura集成發生衝突。嘗試檢查依賴關係樹中的asm.jar。也許這會導致jenkins環境中的運行時問題。

,在我所在的機構工作(與包括org.json依賴項目)一個設置:

  • 最新詹金斯版本1.596結合在詹金斯的Cobertura-插件1.9.6
  • 最新cobertura-maven-plugin Maven插件爲各種項目版本2.6

我強烈的猜測:這不是關於JSON東西本身,而是關於你的設置環境;你的Jenkins版本1.553有點過時。如果可能的話,我建議你去升級你的管理員/其他項目。

+0

它與asm沒有衝突我已經檢查過。 'cobertura-maven-plugin'版本是2.6。我會研究更新詹金斯的可行性。 – clD 2015-01-23 12:59:52

+0

你有沒有找到更新你的虛擬機/機器上Jenkins的方法?這是解決問題的方法,正如我的答案中所建議的那樣? – MWiesner 2015-02-03 11:28:08

1

此異常和堆棧跟蹤有誤導性;它實際上是由於沒有包含在你的類路徑中的SLF4J + ch.qos.logback.ant/lib路徑或一些可用於ant的其他類路徑)。對於ch.qos.logback SLF4J實現,Cobertura(至少包括2.1.1)具有特定要求。如果不包括這SLF4J實現,則可能會導致以下堆棧跟蹤:

java.lang.NoClassDefFoundError: net/sourceforge/cobertura/coveragedata/TouchCollector 
    at [org.package.ClassName].__cobertura_init([ClassName].java) 
    at [org.package.ClassName].<clinit>([ClassName].java) 
    at [org.package.ClassName]Test.[method]([ClassName]Test.java:113) 
Caused by: java.lang.ClassNotFoundException: net.sourceforge.cobertura.coveragedata.TouchCollector 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

就我而言,我已經在我的.ant/lib類路徑中有slf4j-simple-1.7.14.jar,我需要將其刪除,並與logback-core-1.0.13.jarlogback-classic-1.0.13.jar更換。之後,我的儀器化測試用例在沒有這種例外的情況下執行。