代码之家  ›  专栏  ›  技术社区  ›  jon hanson

在servlet中休眠会导致noclassedeffounderror:org/slf4j/loggerfactory

  •  4
  • jon hanson  · 技术社区  · 15 年前

    我有一个Java(6)应用程序,它使用Hibernate(V3.3.2)从HSQL LDB读取数据,我用Eclipse(V3.5.1)构建和调试/运行,并且它工作正常。

    然后我创建了一个GWT(v1.7)servlet Web应用程序,将我的Hibernate类复制到其中,并添加了相同的用户库依赖项。但是,当我运行servlet并尝试访问调用我的代码的URL时,我会得到:

    java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:152)
        at xxx.daoimpl.DAOSession.initialise(DAOSession.java:40)
    

    DaSeaDea. Java:40是:

    AnnotationConfiguration config = new AnnotationConfiguration ();
    

    谷歌搜索这个错误表明我在类路径中缺少slf4j-api.jar,但是如果我在命令行中查找调试属性,我可以在那里看到这个jar:

    C:\java\jsedk_6\jre\bin\javaw.exe
    -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:54541
    -Xmx512m -Dfile.encoding=Cp1252
    -classpath
        D:\dev\workspace\xxx\src;
        D:\dev\workspace\xxx\resources;
        D:\dev\workspace\xxx\war\WEB-INF\classes;
        C:\java\eclipse\plugins\com.google.gwt.eclipse.sdkbundle.win32_1.7.1.v200909221731\gwt-windows-1.7.1\gwt-user.jar;
        C:\java\eclipse\plugins\com.google.gwt.eclipse.sdkbundle.win32_1.7.1.v200909221731\gwt-windows-1.7.1\gwt-dev-windows.jar;
        C:\java\hibernate-annotations-3.4.0.GA\hibernate-annotations.jar;
        C:\java\hibernate-annotations-3.4.0.GA\lib\ejb3-persistence.jar;
        C:\java\hibernate-annotations-3.4.0.GA\lib\hibernate-commons-annotations.jar;
        C:\java\hibernate-distribution-3.3.2.GA\hibernate3.jar;
        C:\java\hibernate-distribution-3.3.2.GA\lib\required\antlr-2.7.6.jar;
        C:\java\hibernate-distribution-3.3.2.GA\lib\required\commons-collections-3.1.jar;
        C:\java\hibernate-distribution-3.3.2.GA\lib\required\dom4j-1.6.1.jar;
        C:\java\hibernate-distribution-3.3.2.GA\lib\required\javassist-3.9.0.GA.jar;
        C:\java\hibernate-distribution-3.3.2.GA\lib\required\jta-1.1.jar;
        C:\java\hibernate-validator-4.0.1.GA\hibernate-validator-4.0.1.GA.jar;
        C:\java\hibernate-validator-4.0.1.GA\lib\validation-api-1.0.0.GA.jar;
        C:\java\hibernate-validator-4.0.1.GA\lib\log4j-1.2.14.jar;
        C:\java\hsqldb\lib\hsqldb.jar;
        C:\java\restlet-jse-2.0m5\lib\org.restlet.jar;
        C:\java\restlet-jee-2.0m5\lib\org.restlet.ext.servlet.jar;
        C:\java\restlet-jse-2.0m5\lib\org.restlet.ext.xml.jar;
        C:\java\slf4j-1.5.8\slf4j-api-1.5.8.jar;
        C:\java\slf4j-1.5.8\slf4j-log4j12-1.5.8.jar
        com.google.gwt.dev.HostedMode
        ...
    

    如果我打开罐子,我可以看到里面的loggerfactory类。

    知道类加载器为什么找不到它吗?

    编辑1: 如果试图从我的代码中访问org.slf4j.loggerfactory,Eclipse可以编译它,但在运行时我会得到相同的错误。

    编辑2: 如果我用一个调用相同代码的main添加一个测试类,并运行它,它就会工作。所以类路径问题似乎是servlet特有的。

    谢谢, 乔恩

    4 回复  |  直到 12 年前
        1
  •  6
  •   jon hanson    15 年前

    似乎把两个slf4j jar复制到war/web-inf/lib子项目/dir中解决了这个问题。我真的不知道为什么我需要为这两个jar而不是项目使用的所有其他hibernate、restlet等jar这样做,尽管我认为为了一致性,无论如何我都会这样做-我想这也会使部署变得更容易。

    如果有人能解释一下为什么这个方法有效,为什么我需要这样做,我会选择它作为“正确的”答案,否则我会选择这个。

        2
  •  3
  •   mhaller    15 年前

    请您再次确认在类路径中至少有两个slf4j.jar文件,slf4j-api.jar和一个实现,如slf4j-jdk14.jar?

    类路径中不能有多个SFLJ4实现。

        3
  •  1
  •   non sequitor    15 年前

    您有一个运行时依赖性问题,所以一切都可以编译,但依赖性在JAR中。您需要访问Hibernate站点并查看兼容性 matrix 并确保正确匹配,然后检查注释和核心的依赖关系。你的洛吉罐子看起来很好,所以这绝对是个怪癖。

    如果它在Eclipse中工作,那么从逻辑上讲,它肯定是两个运行时(Eclipse和非Eclipse)之间的一些差异,如果矩阵检查得很好,那么看看您是否能够将2中的共性因素考虑进去,然后计算出差异——您的答案应该在这里。

        4
  •  1
  •   Brian Deterling    15 年前

    我有一个类似的问题,除了我使用的是Tomcat,而noclassdefound错误出现在juli记录器上。我通过在托管模式下运行时从类路径中删除Tomcat依赖项来修复它,因为托管模式嵌入了一个冲突的Tomcat服务器。因此,我将看到如果您从类路径中删除部分或全部restlet jar以查看它们是否冲突,会发生什么情况。