2015-02-05 93 views
0

我想在一个Java servlet运行UADetector,但我得到的错误:SLF4J ClassNotFoundException的

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”

这为我的其他罐的工作,以及(如MySQL连接器的Java)

编辑3 : 因此编译和运行时的类路径可能不同。我不知道哪些罐子在运行时是必须的,哪些只用于编译。所以我复制了也在WEB-INF/lib文件夹中使用的所有jar。在部署大会,我有以下:

来源

  • /src目录
  • /的WebContent

部署路径

  • /WEB-INF/classes中
  • /

WEB-INF位于WebContent中,所以我认为这应该是正确的。

但为什么类org.slf4j.LoggerFactory缺失?

+0

您的项目>属性>部署程序集>在表中您应该有/ WebContent – 2015-02-06 08:51:24

+0

@ToKra对不起,但我不明白我需要做什么。/WebContent已经在表中,不是吗? – user3605780 2015-02-06 09:23:52

+0

好的,另一个问题:你在./WEB-INF/lib中有什么SLF4J&Log4j(或LogBack)库? – 2015-02-06 10:41:52

回答

1

在您的项目中,您添加了库吗?他们需要位于WEB-INF/lib/目录中,以便在应用程序中部署到应用程序服务器,并在运行时部署到CLASSPATH中。请注意,运行时CLASSPATH可能与用于编译的CLASSPATH非常不同。



I go to File -> properties -> java build path -> "Add External JARs"

不要那样做。这会设置用于编译的CLASSPATH,但不会使JavaEE容器中的库在运行时可用。对于不在团队中工作的Java SE项目(或者团队中的每个人都有相同的计算机路径),但对于Java EE并不适用。

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

+0

我试图在lib文件夹中复制它们,但是我得到了一个不同的错误。为了更加清晰,我编辑了我的问题。 – user3605780 2015-02-05 22:34:26

+0

我根据您在问题中提供的附加信息更新了我的答案。 – dsh 2015-02-06 15:51:51

0

看来你有问题SLF4J缺少的JAR: 您需要SLF4J API然后IMPL这可能是:

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

在项目中,我有这些JAR:(1日是只向后兼容的,因为到LOG4J) enter image description here

让我知道,如果这有助于。

+0

嗨,我去聊天,但得到了现在的回应。所以这就是我所做的: 我下载了LOG4J2,并将所有jar放在lib文件夹中,但是这给了一个stackoverflow错误 – user3605780 2015-02-06 13:55:33

+0

我看到这主要是由错误的递归引起的。所以我创建了一个新项目。我只添加了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 – user3605780 2015-02-06 13:56:13

相关问题