2009-05-22 10 views
2

私はGlassfishドメインとNetbeansの私のプロジェクトのライブラリコレクションの両方にHibernateライブラリを入れました。 hibernate-entitymanager.jarには、HibernatePersistence(コールスタックの最後のクラス)とEjb3Configurationの両方が含まれているため、Ejb3Configurationの欠落しているクラスエラーが発生する理由がわかりません。GlassfishのHibernate - Ejb3Configuration NoClassDefFoundError

java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.ejb.Ejb3Configuration 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:130) 
    at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:149) 
    at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:84) 
... 

答えて

8

私はこの特定のエラーメッセージを以前に見たことがありませんでしたが、それが意味することについて少し説明して、考えられる原因の1つを挙げることができます。

ライン

 
java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.ejb.Ejb3Configuration 

は、JVMがクラスorg.hibernate.ejb.Ejb3Configurationを見つけることができなかったことを意味するものではありません。これは、JVMがこのクラスを見つけることができますが、すでにこのクラスをロードしようとしましたが失敗したことを意味します。

これが起こったことを示すテキストはCould not initialize class ...です。 - Javaの5に対応する例外はありませんがあり

 
java.lang.NoClassDefFoundError: org/hibernate/ejb/Ejb3Configuration 

さておき、それはまたあなたは、Java 6を使用している手段として:JVMがすべてのクラスを見つけることができなかった場合は、代わりに次のようなものを取得したいですメッセージ。

次の2つのクラスは、この動作のデモンストレーションを提供します。静的イニシャライザは常に例外をスローするため、クラスUnloadableはロードできません。このクラスを読み込み、その結果であるExceptionInInitializerErrorをキャッチして、Unloadableを再度ロードしようとします。

class Unloadable { 
    static { 
     if (true) { throw new RuntimeException(); } 
    } 
} 

public class LoadingTest { 
    public static void main(String[] args) throws Exception { 
     try { 
      Class.forName("Unloadable"); 
     } 
     catch (ExceptionInInitializerError e) { 
      try { 
       Class.forName("Unloadable"); 
      } 
      catch (NoClassDefFoundError e2) { 
       System.out.println("XXXXXXXXXXXXXXXXXXXXX"); 
       e2.printStackTrace(System.out); 
      } 
     } 
    } 
} 

私はクラスLoadingTestを実行すると、私は次のような出力が得られます。

 
XXXXXXXXXXXXXXXXXXXXX 
java.lang.NoClassDefFoundError: Could not initialize class Unloadable 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:169) 
     at LoadingTest.main(LoadingTest.java:14) 

私は失敗するorg.hibernate.ejb.Ejb3Configurationをロードするために、元の試みを引き起こしているものを言うことはできません。 Ejb3Configuration自体がクラスパスから欠落しているクラスに依存している可能性があります。 importEjb3Configurationで編集され、java.*またはjavax.*以外のすべてがGlassfishとNetbeansが見ることができるJAR内にあることを確認することは価値があるかもしれません。

また、JVMがロードしようとしている理由は、Ejb3Configurationとなり、の2回だけです。クラスのロードが初めて失敗すると、例外(通常はサブクラスの一部がLinkageError)がスローされます。私の最高の推測では、次のような何かが起こっているということですので、このタイプの例外は、多くの場合、キャッチされていません。

try { 
    // Some code that loads Ejb3Configuration and fails. 
} 
finally { 
    // Some code that also loads Ejb3Configuration and fails. 
} 

finallyブロック内のコードが例外をスローした場合、この例外がでスローされた例外を置き換えますtryブロック。似たようなことがthis questionで起こったので、私はこれを提案します。この質問に掲載されたスタックトレースは、finallyブロック内にあります。

まだ私の答えがあなたを助けない場合は、見ているスタックトレース全体を投稿してください。

+0

実際にLog4J構成になっているように見えますが、これはサーバーを最初に再起動したとき以外はスタックトレースには記載されていません。 –

3

私の場合はバージョン固有の問題であるようですが、この問題もありました。新しいバージョンのhibernateはSimple Logging Facade for Java(SLF4J)に依存しますが、Mavenの成果物にはAPIしか含まれていないため、WARまたはサーバーのlibフォルダにランタイムライブラリが必要です。

これは、3.4.0バージョンのHibernate Entity Managerに固有ですが、他のバージョンにも適用されます。 Hibernate Core 3.3.xを使用している場合は、3.4.xシリーズのHibernate EMを使用しているので、これらのランタイムライブラリが必要です。

関連する問題