Jenkins Cobertura构建 - NoClassDefFoundError

3

我有一个测试类ProcessorTest,其中包含以下代码行

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

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

在本地主机上一切都运行正常(即所有的Maven和JUnit测试都执行)。

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

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项目不可用。
3个回答

2
这个异常和堆栈跟踪具有误导性;实际上它是由于您的类路径(.ant/lib 路径或其他可用于 Ant 的类路径)中没有包含 SLF4J + ch.qos.logback 导致的。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。之后,我的插装测试用例成功执行而没有出现这个异常。

0

两个 Java 版本是相同的。 - clD

0

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

纯粹的Cobertura库本身(与项目的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的可行性。 - clD
你找到了在你的虚拟机/机器上更新Jenkins的方法吗?这是我的答案中建议的解决方案吗? - MWiesner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接