簡體   English   中英

SLF4J ClassNotFoundException

[英]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。 在部署程序集中,我具有以下內容:

資源

  • / src目錄
  • /網頁內容

部署路徑

  • / WEB-INF /類
  • /

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規范要求它們的位置。

似乎您缺少SLF4J JAR時遇到問題:您需要SLF4J API然后需要IMPL ,可能是:

我過去使用LOGBACK是因為我喜歡它的XML配置。 在我們的項目中,我們使用了LOG4J,但后來又遷移到了最新的LOG4J2,它應該比其他記錄器具有更好的性能。

在我的項目中,我有以下JARS :(第一個只是因為向后兼容LOG4J) 在此處輸入圖片說明

讓我知道是否有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM