【发布时间】:2015-02-05 22:05:36
【问题描述】:
我想在 Java servlet 中运行 UADetector,但出现错误:
java.lang.NoClassDefFoundError: net/sf/uadetector/service/UADetectorServiceFactory
test.doGet(test.java:158)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
但是我已将 jar 文件添加到我的库中,并且我在项目文件夹中看到它们(我使用 Eclipse)。
这是我的代码:
import java.lang.*;
import java.io.IOException;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import net.sf.uadetector.service.UADetectorServiceFactory;
import net.sf.uadetector.UserAgent;
import net.sf.uadetector.UserAgentStringParser;
import net.sf.uadetector.ReadableUserAgent;
/**
* Servlet implementation class test
*/
@WebServlet("/test")
public class test extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
PrintWriter out = response.getWriter();
// Get an UserAgentStringParser and analyze the requesting client
UserAgentStringParser parser = UADetectorServiceFactory.getResourceModuleParser();
ReadableUserAgent agent = parser.parse(request.getHeader("User-Agent"));
out.append("You're a <em>");
out.append(agent.getName());
out.append("</em> on <em>");
out.append(agent.getOperatingSystem().getName());
out.append("</em>!");
}
}
有没有其他人遇到过这个问题?
编辑: 将 jar 放入 WEB-INF/lib 文件夹后,错误已更改为:
exception
javax.servlet.ServletException: Servlet execution threw an exception
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
java.lang.NoClassDefFoundError: net/sf/uadetector/service/UADetectorServiceFactory
test.doGet(test.java:158)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
net.sf.uadetector.datareader.XmlDataReader.<clinit>(XmlDataReader.java:85)
net.sf.uadetector.service.UADetectorServiceFactory$ResourceModuleXmlDataStore.<clinit>(UADetectorServiceFactory.java:62)
net.sf.uadetector.service.UADetectorServiceFactory.<clinit>(UADetectorServiceFactory.java:92)
test.doGet(test.java:158)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
编辑2: 看来我需要更具体地说明如何添加 jar 文件。
我转到文件 -> 属性 -> java 构建路径 -> “添加外部 JAR”
这也适用于我的其他 jars(如 mysql-connector-java)
编辑 3: 所以编译和运行时的类路径可以不同。我不知道哪些 jars 是运行时需要的,哪些只用于编译。所以我复制了所有也在 WEB-INF/lib 文件夹中使用的 jar。在部署程序集中,我有以下内容:
来源
- /src
- /网页内容
部署路径
- /WEB-INF/类
- /
WEB-INF 位于 WebContent 中,所以我认为这应该是正确的。
但是为什么类:org.slf4j.LoggerFactory 不见了?
【问题讨论】:
-
你的项目 > 属性 > 部署程序集 > 在表中你应该有 /WebContent
-
@ToKra 很抱歉,但我不明白我需要做什么。 /WebContent 已经在表格中了,不是吗?
-
好的,另一个问题:你在 ./WEB-INF/lib 中有哪些 SLF4J 和 Log4j(或 LogBack)库?
-
我从slf4j.org/download.html下载了slf4j-1.7.10.zip,解压后将整个文件夹放在./WEB-INF/lib中。
-
@ToKra ,我想我明白出了什么问题。 SLF4J 是 UADetector 的依赖项。但我没有正确添加 SLF4J。我将slf4j-api-1.7.10.jar从文件夹中取出,直接放到/WEB-INF/lib文件夹中,然后消息变成了另一个ClassNotFoundException。如何正确添加此依赖项?
标签: java eclipse servlets user-agent