【问题标题】:SLF4J ClassNotFoundExceptionSLF4J ClassNotFoundException
【发布时间】: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


【解决方案1】:

您在项目中的哪个位置添加了这些库?它们需要位于WEB-INF/lib/ 目录中,才能与您的应用程序一起部署到应用程序服务器,并在运行时位于 CLASSPATH 中。请注意,运行时 CLASSPATH 可能与用于编译的 CLASSPATH 大不相同。



我转到文件->属性-> java构建路径->“添加外部JAR”

不要那样做。这会设置用于编译的 CLASSPATH,但不会使库在运行时在您的 JavaEE 容器中可用。对于您不在团队中工作的 Java SE 项目(或者团队中的每个人在他们的计算机上都有相同的路径)但不能很好地与 Java EE 一起工作的 Java SE 项目,这是可以的。

既然在您的部署程序集中,项目中名为“WebContent”的目录将成为已部署 JAR/WAR 的根目录,请将库 jar 文件复制到 WebContent/WEB-INF/lib/。然后,当您的应用程序被部署时,它将包含这些库,并且它们将位于 JavaEE 规范需要它们的位置。

【讨论】:

  • 我尝试将它们复制到 lib 文件夹中,但随后出现不同的错误。为了更清楚,我编辑了我的问题。
  • 我根据您在问题中提供的其他信息更新了我的答案,并提供了更多细节。
【解决方案2】:

您似乎遇到了SLF4J 缺少 JAR 的问题: 你需要SLF4J API 然后IMPL 这可能是:

我在过去使用 LOGBACK 是因为我喜欢它的 XML 配置。在我们的项目中,我们使用了 LOG4J,但后来迁移到了最新的 LOG4J2,它应该比任何其他记录器都有更好的性能。

在我的项目中,我有这些 JARS:(第一个只是因为向后兼容 LOG4J)

如果这有帮助,请告诉我。

【讨论】:

  • 嗨,我参加了聊天,但现在得到了回复。所以这就是我所做的:我下载了 LOG4J2,并将所有 jar 放在 lib 文件夹中,但这给出了 stackoverflow 错误
  • 我看到这主要是由错误的递归引起的。所以我创建了一个新项目。我只添加了 log4j-api-2.1.jar、log4j-core-2.1.jar、log4j-impl-2.1.jar 和 slf4j-api-1.7.10.jar 然后我有 tomcat 8.0 库和 jdk1.8.0_31 库和tomcat lib 文件夹我有 uadetector-core-0.9.22.jar、uadetector-json-0.1.22.jar、uadetector-resources-2014.10-sources.jar 和 uadetector-resources-2014.10.jar 现在我收到错误: java.lang.NoClassDefFoundError: 无法初始化类 net.sf.uadetector.service.UADetectorServiceFactory
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2023-03-16
  • 2020-07-18
相关资源
最近更新 更多