2009-09-09 23 views
61

私は自分のプロジェクトを実行すると、私はこのエラーの多数の出力を得る:「NoClassDefFoundErrorが:クラス初期化できませんでした」というエラーを

 
Sep 9, 2009 8:22:23 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet Jersey threw exception 
java.lang.NoClassDefFoundError: Could not initialize class SpringFactory 
     at com.point2.prospect.persistence.hibernate.HibernateTransactionInterceptor.doFilter(HibernateTrans 
actionInterceptor.java:17) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at com.point2.prospect.restapi.ServerErrorInterceptor.doFilter(ServerErrorInterceptor.java:27) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
     at java.lang.Thread.run(Thread.java:619) 

私はこの問題は、すべてWeb上で求められているのパターンを持っていることがわかりますが、本当の答えはありません。この種のエラーの一般的な原因は何ですか?

答えて

6

必要なクラス定義がありません。通常、必要なJARがクラスパスにないことが原因です。 J2SE APIから

public class NoClassDefFoundError extends LinkageError

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

+2

存在しないクラスの実際の名前は、どこかにネストされた例外メッセージ内にあるはずです。 –

171

がNoClassDefFoundエラーが漠然とエラーであり、多くの場合、より深刻な問題を隠しています。 ではなく、で、ClassNotFoundException(クラスが存在しない場合にスローされます)と同じです。

がNoClassDefFound のJavadocが示すように、クラスが、そこにないことを示すかもしれないが、クラスローダは、クラスのバイトをロードし、それらの「defineClass」を呼び出すした後に、それは一般的に、ときにスローされます。他の手掛かりや可能性のある "原因"の例外については、完全なスタックトレースを慎重にチェックしてください(特定のバックトレースには表示されません)。

NoClassDefFoundErrorを取得した最初の場所は、クラスの静的ビット、つまりクラスの定義中に行われる初期化です。これが失敗した場合、NoClassDefFoundErrorがスローされます.ExceptionInInitializerErrorをスローして問題の詳細を示すはずですが、私の経験上、これはまれです。 ExceptionInInitializerErrorは、クラスを初めて定義しようとするときにのみ実行され、その後はNoClassDefFoundをスローします。だから、以前のログを見てください。

私は、そのHibernateTransactionInterceptor行のコードを見て、それが何を必要としているのかを見てみることを勧めます。 SpringFactoryクラスを定義することができないようです。だから、おそらくそのクラスの初期化コードを確認することができます。 もしそれをデバッグすることができれば、上の最後の行(17)でそれを停止し、デバッグして、例外の原因となっている正確な行を見つけることができます。また、ExceptionInInitializerErrorがあることが非常に幸運な場合は、ログの上位を確認してください。

+20

ありがとうございます。静的イニシャライザブロックに注意を向けて、何時間もの悪化を救った。 –

+1

"すなわち、クラスの定義中に行われる初期化" - ありがとう! –

+2

別の良いアイデアは、あなたのログをファイルにパイプし、java.lang.ClassNotFoundExceptionを探すことです。そこには、NoClassDefFoundError例外を生成するどのクラスを読み込もうとしているかを教えてくれる、迷子なものがあるかもしれません。私のために働いた。 –

0

jarライブラリが他のLinuxユーザー(ルート)によってコピーされ、ログインしたユーザー(プロセス)がjarファイルの内容を読み取るのに十分な特権を持たなかったため、私は同じ問題に直面しました。

0

このエラーが発生したときにOpenJDKを使用していることを認識しました。代わりにOracle JDKをインストールした後に修正されました。

関連する問題