【问题标题】:Jenkins Cobertura build - NoClassDefFoundErrorJenkins Cobertura 构建 - NoClassDefFoundError
【发布时间】:2015-02-18 08:30:54
【问题描述】:

我有一个测试类 ProcessorTest 带有线条

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

XML 类来自json.org。该类在代码中的其他地方使用没有问题。

在 localhost 上一切正常(即所有 Maven 和 JUnit 测试都执行)。

当我推送到 Jenkins 时,我收到了这个错误:

詹金斯错误

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 项目无法用于测试。

【问题讨论】:

    标签: java unit-testing junit jenkins cobertura


    【解决方案1】:

    您的 Jenkins 机器中似乎有不同的 Java 版本。尝试安装与本地完全相同的版本。 更多信息在这里:https://github.com/cobertura/cobertura/issues/52

    【讨论】:

    • 两个 Java 版本完全相同。
    【解决方案2】:

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

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

    适用于我机构的设置(项目包含 org.json 依赖项):

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

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

    【讨论】:

    • 它与 asm 没有冲突,我已经检查过了。 cobertura-maven-plugin 版本是 2.6。我将研究更新 Jenkins 的可行性。
    • 您是否找到了在您的虚拟机/机器上更新 Jenkins 的方法?正如我的回答所建议的那样,这是解决问题的方法吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-10
      • 2013-02-03
      • 2018-08-13
      • 1970-01-01
      • 2013-09-14
      • 2013-03-06
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多