为什么Bamboo为嵌入式jetty测试抛出NoClassDefFoundError?

时间:2015-10-15 16:24:53

标签: maven jetty bamboo

我们正在运行嵌入式jetty服务器,以便在集成阶段进行集成测试。

当我们在本地运行maven构建时,它工作正常,但在Bamboo上它失败并出现以下错误:

error   15-Oct-2015 16:03:34
       java.lang.NoClassDefFoundError: org/eclipse/jetty/util/thread/QueuedThreadPool$1
error   15-Oct-2015 16:03:34        at org.eclipse.jetty.util.thread.QueuedThreadPool.doStop(QueuedThreadPool.java:126)
error   15-Oct-2015 16:03:34        at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:89)
error   15-Oct-2015 16:03:34        at org.eclipse.jetty.util.component.AggregateLifeCycle.doStop(AggregateLifeCycle.java:107)
error   15-Oct-2015 16:03:34        at org.eclipse.jetty.server.handler.AbstractHandler.doStop(AbstractHandler.java:69)
error   15-Oct-2015 16:03:34        at org.eclipse.jetty.server.handler.HandlerWrapper.doStop(HandlerWrapper.java:108)
error   15-Oct-2015 16:03:34        at org.eclipse.jetty.server.Server.doStop(Server.java:341)
error   15-Oct-2015 16:03:34        at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:89)
error   15-Oct-2015 16:03:34        at org.eclipse.jetty.util.thread.ShutdownThread.run(ShutdownThread.java:131)
error   15-Oct-2015 16:03:34    Caused by: 
error   15-Oct-2015 16:03:34    java.lang.ClassNotFoundException: org.eclipse.jetty.util.thread.QueuedThreadPool$1
error   15-Oct-2015 16:03:34        at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)

我们尝试为缺少的类添加一个显式的maven依赖项给jetty-util,

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-util</artifactId>
    <version>8.1.9.v20130131</version>
</dependency>

但这没效果。

jetty-util已作为依赖项包含在内,我们发现默认情况下它已正确复制到WEB-INF / lib中。无论如何,我们还尝试将该jar添加到Web应用程序库中,但这也无效。

一个非常尖锐的观察......缺少的类是QueuedThreadPool $ 1,一个内部类QueuedThreadPool。这很有趣,因为对QueuedThreadPool.doStop()的调用没有失败,直到它反过来调用QueuedThreadPool $ 1。但是这些都是在同一个罐子里定义的,那么如何找到一个而不是另一个? (我检查了依赖树,看看我们是否可能选择了一个不包含该内部类的旧版本,但事实并非如此,此外,jar的所有最新版本都有内部类。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您到达org.eclipse.jetty.util.component.AbstractLifeCycle.stoporg.eclipse.jetty.server.Server.doStop,那么您无法拥有ClassNotFoundException QueuedThreadPool,因为该类从一开始就存在,以便甚至达到了这一点。

正在进行其他事情,这不是ClassLoader问题,正如您所假设的那样。