4

Hibernate (V3.3.2) を使用して HSQLDB からデータを読み取る Java (6) アプリケーションがあり、これを Eclipse (V3.5.1) でビルドおよびデバッグ/実行しましたが、正常に動作します。

次に、GWT (V1.7) サーブレット Web アプリを作成し、休止状態のクラスをそこにコピーして、同じユーザー ライブラリの依存関係を追加しました。ただし、サーブレットを実行して、コードを呼び出す URL にアクセスしようとすると、次のようになります。

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

DAOSession.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
    ...

jar を開くと、そこに LoggerFactory クラスが表示されます。

クラスローダーで見つからない理由はありますか?

編集 1:コードから org.slf4j.LoggerFactory にアクセスしようとすると、Eclipse は正常にコンパイルされますが、実行時に同じエラーが発生します。

編集 2:同じコードを呼び出して実行するメインの Test クラスを追加すると、動作します。したがって、このクラスパスの問題はサーブレットに固有のようです。

ありがとう、ジョン

4

4 に答える 4

6

2 つの slf4j jar を war/WEB-INF/lib sub-project/dir にコピーすると問題が解決したようです。プロジェクトが使用する他のすべてのHibernate、Restletなどのjarではなく、これら2つのjarに対してこれを行う必要がある理由はよくわかりませんが、一貫性を保つためにとにかくそれを行うと思います-私はそれが作ると思います導入も簡単です。

なぜこれが機能したのか、なぜそれを行う必要があるのか​​ について何らかの説明を提供できる場合は、それを「正しい」回答として選択します。そうでない場合は、これを選択します。

于 2009-11-07T15:32:22.337 に答える
1

実行時の依存関係の問題があるため、すべてが正常にコンパイルされますが、依存関係はjarにあります。Hibernateサイトにアクセスして互換性マトリックスを確認し、正しく一致していることを確認してから、アノテーションとコアの依存関係を確認する必要があります。log4J jarは見栄えが良いので、間違いなくちょっと変わっています。

Eclipseで機能する場合、論理的には2つのランタイム(Eclipseと非Eclipse)の間に間違いなく多少の違いがあります。マトリックスが正常にチェックアウトされている場合は、2つの共通点を除外できるかどうかを確認し、違いを見つけてください。そこにあるはずです。

于 2009-11-07T00:56:02.547 に答える
1

Tomcatを使用していて、NoClassDefFoundエラーがジュリロガーにあったことを除いて、同様の問題が発生しました。ホストモードでは競合していたTomcatサーバーが埋め込まれているため、ホストモードで実行しているときにクラスパスからTomcatの依存関係を削除することで修正しました。したがって、クラスパスからレストレットjarの一部またはすべてを削除して、それらが競合するかどうかを確認するとどうなるかを確認します。

于 2009-11-07T03:39:43.613 に答える