线程中的NoClassDefFoundError问题

4

嗨,当我运行一个线程时,我遇到了NoClassDefFoundError异常。

当我不使用线程执行此进程时,它可以正常运行,但是当我执行start方法时,在不同的语句中会出现这个错误。

线程是否可能有与主线程不同的类路径?

谢谢。

编辑以添加代码:

运行方法:

public void run(){
    try{
        boolean startAction = HeapThread.addAction(idCliente, idThread, Constants.ACTION_CREATE_TOPIC);
        if (!startAction) {
            synchronized (this){
                this.wait();
            }
        }
        createTopic();
    }
    catch(Exception ex){
        log.error("Error", ex);
    }
    finally {
        Long nextIdThread = HeapThread.getNextAction(idCliente, idThread, Constants.ACTION_CREATE_TOPIC);
        if (nextIdThread > 0){
            log.debug("Thread");
            ThreadState thread = HeapThread.getState(nextIdThread);
            synchronized (thread) {
                thread.notify();
            }
        }
    }
}

createTopic() 函数调用 searchBlog(),在这里我调用了 this。

try{
        sessionId = SessionWS.createSession(url, false);
        CrawlerSearch crawler = new CrawlerSearchAPIService(new URL(url + Constants.URL_CRAWLER), new QName(Constants.QNAME_CRAWLER, "CrawlerSearchAPIService")).getCrawlerSearchAPIPort();
        // para cada topico obtnemos 10 blogs
        for (Long idTopic : blogsTopics.keySet()) {

完整的异常信息如下:

java.lang.NoClassDefFoundError: com/befasoft/common/business/webservices/client/Session
at com.befasoft.common.business.webservices.client.SessionAPIService.getSessionAPIPort(SessionAPIService.java:56)
at com.befasoft.common.business.webservices.SessionWS.createSession(SessionWS.java:21)
at com.humanlike.web.tools.Crawler.searchBlogs(Crawler.java:50)
at com.humanlike.web.theads.CreateTopic.createTopic(CreateTopic.java:164)
at com.humanlike.web.theads.CreateTopic.run(CreateTopic.java:63)

1
如果没有特殊的干预,新线程将继承来自原始线程的类加载器。如果您不发布您的代码,您将得不到太多帮助。 - Marko Topolnik
@Kongol:你能否更具体一些?如果可能,请发布完整的代码。 - Naveen
1
每个线程都有自己的ClassLoader,它继承了父ClassLoader,你需要将ClassLoader设置给线程。理想情况下,你不应该遇到这个异常,你能解释一下你的设置是什么(Tomcat、Weblogic等)? - Anantha Sharma
2
...以及错误的确切堆栈跟踪,其中包含堆栈跟踪所涉及的代码行指示。 - Marko Topolnik
@AnanthaSharma 每个线程都有自己的上下文类加载器,但这是一种不同的机制。它会导致ClassNotFoundException而不是NoClassDefFoundError - Marko Topolnik
添加了代码和@AnanthaSharma,我使用Tomcat 7和Struts 2.0。 - Kongol
2个回答

1
Solver,我只需要用线程类加载器来指定它。
ct.setContextClassLoader(ClassLoader.getSystemClassLoader());

感谢Anantha Sharma指导我


1
我的猜测是com.befasoft.common.business.webservices.client.Session之前曾经因为ExceptionInInitializerError而失败。这会导致后续调用出现NoClassDefFoundError。请从一开始检查日志。

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