web-dev-qa-db-ja.com

「NoClassDefFoundError:クラスを初期化できませんでした」エラー

プロジェクトを実行すると、このエラーの多数の出力が表示されます。

 2009年9月9日8:22:23 AM org.Apache.catalina.core.StandardWrapperValve invoke 
 SEVERE:Servlet JerseyのServlet.service()が例外をスローしました
 Java.lang .NoClassDefFoundError:com.point2.prospect.persistence.hibernate.HibernateTransactionInterceptor.doFilter(HibernateTrans 
 actionInterceptor.Java:17)
でorg.ApacheでクラスSpringFactory 
を初期化できませんでした。 catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:235)
 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.StandardWrapperVa lve.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)
 org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:286)
 at org.Apache.coyote.http11.Http11Processor.process(Http11Processor。 Java:845)
 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)

この問題には、ウェブ全体で尋ねられるパターンがありますが、実際の答えはありません。この種のエラーの一般的な原因は何ですか?

71
bm

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

NoClassDefFound mayは、javadocsが示すように、クラスが存在しないことを示しますが、通常、クラスローダーがクラスのバイトをロードし、「defineClass」を呼び出したときにスローされます。また、他の手がかりや考えられる「原因」例外がないか、スタックトレース全体を慎重に確認してください(ただし、特定のバックトレースには何も表示されません)。

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

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

189
Michael Wiles

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

J2SE API から:

パブリッククラスNoClassDefFoundErrorはLinkageErrorを拡張します

Java仮想マシンまたはClassLoaderインスタンスが(通常のメソッド呼び出しの一部として、または新しい式を使用して新しいインスタンスを作成する一部として)クラスの定義を読み込もうとした場合にスローされます。クラスが見つかりました。

検索対象のクラス定義は、現在実行中のクラスがコンパイルされたときに存在していましたが、定義はもう見つかりません。

6
ChssPly76

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

1
Kayvan Tehrani

私はこれを持っていました:

 class Util {
  static boolean isNeverAsync = System.getenv().get("asyncc_exclude_redundancy").equals("yes");
}

おそらく問題を見ることができます。env変数は文字列ではなくnullを返す可能性があります。理論をテストするために、次のように変更しました。

 class Util {
  static boolean isNeverAsync = false;
}

そして問題はなくなりました。 Javaではエラーの正確なスタックトレースが得られないのは残念ですが、ちょっと奇妙です。

0
user5047085