【问题标题】:java.lang.NoClassDefFoundError: com/hp/hpl/jena/shared/BadURIException on running servletjava.lang.NoClassDefFoundError: com/hp/hpl/jena/shared/BadURIException on running servlet
【发布时间】:2009-08-04 11:06:49
【问题描述】:

运行一个非常简单的 servlet 时,我得到一个“java.lang.NoClassDefFoundError: com/hp/hpl/jena/shared/BadURIException”。错误指向“Tagger”类的初始化。代码如下

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import my.package.Tagger;

public class NormaliserServlet extends HttpServlet{
    public void doGet(HttpServletRequest req, HttpServletResponse response) throws IOException{
        Tagger pot = new Tagger("");

        response.setContentType("text");
        PrintWriter out = response.getWriter();
        out.println("hello");
        out.println(pot.someMethod());
        out.close();

        this.log("Request for normaliser");
    }
}

war 文件包含在 WEB-INF/lib 中定义“Tagger”的 jar 文件,类似的调用在 servlet 之外工作。我似乎无法找到问题所在。 web.xml 也很标准:

<servlet>
    <servlet-name>normalise</servlet-name>
    <servlet-class>NormaliserServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>normalise</servlet-name>
    <url-pattern>/normalise</url-pattern>
</servlet-mapping>

我使用 winstone 作为 servlet 容器,但我在 tomcat 中得到完全相同的错误。堆栈跟踪是:

java.lang.NoClassDefFoundError: com/hp/hpl/jena/shared/BadURIException
    at NormaliserServlet.doGet(NormaliserServlet.java:13)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:104)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:45)
    at winstone.ServletConfiguration.execute(ServletConfiguration.java:249)
    at winstone.RequestDispatcher.forward(RequestDispatcher.java:335)
    at winstone.RequestHandlerThread.processRequest(RequestHandlerThread.java:244)
    at winstone.RequestHandlerThread.run(RequestHandlerThread.java:150)
    at java.lang.Thread.run(Thread.java:619)

【问题讨论】:

    标签: java eclipse tomcat servlets


    【解决方案1】:

    您缺少来自Jena project 的jar 文件。 它们应该在您的 WAR 文件中。

    它可能是您使用的其他库的间接依赖。查看堆栈跟踪,看看 Jena 和您的代码之间还有什么。

    【讨论】:

      【解决方案2】:

      看起来您缺少定义 BadURIException 类的 Jena(?) 的 jar。该 jar 是否也包含在您的 WEB-INF/lib 目录中?您是否尝试过在 Winstone 中查看解压后的 war 文件并检查相关的 jar 是否都在那里?

      【讨论】:

      • 好吧,它似乎已经成功了(我现在又遇到了一个错误),但我仍然不明白为什么我必须包含一个我的应用程序实际上并没有使用的 jar 文件。 Tomcat 做同样的事情。包含它需要的库不应该是容器的工作吗? winstone/tomcat 的设置问题吗?
      • @brice:您确定您的应用程序不使用该库吗? Tomcat 肯定不会,我无法想象 Winstone 会这样做。
      • @brice 它可能是您的应用程序,或者它使用的库之一,但在某个地方似乎依赖于 Jena。如果它也发生在 Tomcat 中,它似乎不太可能是 Winstone
      • @Thilo:你说得对,我是个十足的混蛋。现在一切都修好了。提醒自己:先责备自己……我什至不应该问这个。
      • @brice,回复:冲洗。 “先责备自己”是一个好政策,但你绝对应该在这里问这个问题。这种问题时常发生在人们身上。
      【解决方案3】:

      这个类 com/hp/hpl/jena/shared/BadURIException,可能由 Tagger 实例化,不在您的 servlet 容器的类路径中。

      如果它在您的 servlet 容器之外工作,则很可能您的环境中有定义类路径的条目。 检查类路径并在 servlet 容器的 lib 目录中复制缺少的 lib。

      【讨论】:

      • 不确定是否真的要将库复制到 servlet 容器的 lib 目录中。这可能会导致冲突。通常的做法是放到web应用的lib目录下(WEB-INF/lib)。
      • 你说得对,webapp上下文下的WEB-INF/lib是更好的选择。
      猜你喜欢
      • 1970-01-01
      • 2020-10-20
      • 2012-02-09
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2013-12-16
      • 2012-12-02
      相关资源
      最近更新 更多