有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jenkins Cobertura构建NoClassDefFoundError

我有一个测试类ProcessorTest,其中包含行

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

我正在使用Jenkins 1.553和Cobertura插件1.9.6

我该如何解决这个问题

项目结构如下:

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


-- org.json
     |
     | - XML.class

当推送到Jenkins时,我假设org.json项目不可用于测试


共 (3) 个答案

  1. # 1 楼答案

    这种奇怪的行为也可能与Jenkins构建机器上的Maven版本不同于您在本地使用的版本有关。您在pom.xml中使用的cobertura-maven-plugin版本也很有趣

    Cobertura library本身(与项目的maven插件捆绑在一起)使用了一系列依赖项,这些依赖项可能与Jenkins环境的Cobertura集成相冲突。尝试检查依赖关系树中的asm.jar。也许这也会导致jenkins环境中的运行时问题

    在我的机构中工作的设置(与包含org.json依赖项的项目一起):

    • 最新Jenkins版本1.596与Jenkins Cobertura插件1.9.6结合使用
    • 最新的cobertura-maven-pluginmaven插件,用于版本2.6中的各种项目

    我强烈的猜测是:这不是关于JSON东西本身,而是关于你的设置环境;你的詹金斯版本有点过时了。如果可能的话,我建议您与管理员/其他项目一起升级

  2. # 2 楼答案

    这种异常和堆栈跟踪具有误导性;它实际上是由于类路径中没有包含SLF4J + ch.qos.logback(ant可用的.ant/lib路径或其他类路径)。Cobertura(至少包括2.1.1)对ch.qos.logbackSLF4J实现有特定的要求。如果不包括此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替换它。在那之后,我的插装测试用例在没有这个异常的情况下执行