2014-12-19 57 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更换。之后,我的仪器化测试用例在没有这种例外的情况下执行。