[英]SLF4J ClassNotFoundException
我想在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>!");
}
}
還有其他人有這個問題嗎?
編輯:也將罐子放在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)
EDIT2:看來我需要更具體一些如何添加jar文件。
我轉到文件->屬性-> Java構建路徑->“添加外部JAR”
這也適用於我的其他jar(例如mysql-connector-java)
編輯3:因此,用於編譯和運行時的類路徑可以不同。 我不知道哪個jar對於運行時是必需的,而僅對於編譯是必需的。 因此,我復制了也在WEB-INF / lib文件夾中使用過的所有jar。 在部署程序集中,我具有以下內容:
資源
部署路徑
WEB-INF位於WebContent中,所以我認為這應該是正確的。
但是,為什么缺少該類:org.slf4j.LoggerFactory?
您在項目中的哪個位置添加了庫? 它們必須位於WEB-INF/lib/
目錄中,以便與您的應用程序一起部署到應用程序服務器,並在運行時部署在CLASSPATH中。 請注意,運行時CLASSPATH可能與用於編譯的CLASSPATH完全不同。
我轉到文件->屬性-> Java構建路徑->“添加外部JAR”
不要那樣做 這將設置用於編譯的CLASSPATH,但不會在運行時使這些庫在JavaEE容器中可用。 對於您不在團隊中工作(或團隊中的每個人在他們的計算機上具有相同路徑)但在Java EE中無法正常工作的Java SE項目來說,這也可以。
由於它似乎出現在您的Deployment Assembly中,因此您項目中名為“ WebContent”的目錄將成為已部署JAR / WAR的根目錄,因此請將庫jar文件復制到WebContent/WEB-INF/lib/
。 然后,在部署您的應用程序時,它將包含這些庫,並且它們將位於JavaEE規范要求它們的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.