突然、以前に動作していたアプリケーションの中で、私はNoClassDefFoundError (wrong name)
が私に困惑しています。私はXMLバインディングフレームワークを使用しています。これはリクエストされたときにバインドされたクラスを解決しようとしました。ClassLoader.loadClass()
をクラス名で設定しています。 (なぜ、それはこの場合、私の外にあるように振る舞うのですか?)今、私はちょうどjava.lang.ClassLoader.defineClass()
で言及された例外を取得します。メソッドのドキュメントでは、パラメータname
が指定されたクラスのバイナリ名と等しくない場合、NoClassDefFoundError
がスローされます。私はそのような場合には1がNoClassDefFoundError:A(間違った名前:A)
java.lang.NoClassDefFoundError: A (wrong name: B)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
....
フォームの例外を取得する予定であることを認識しています、これは私が実際に見る成果ですが、奇妙なことが、私の場合で報告A
とB
がまったく同じであるということです!私はアプリをデバッグしようとしました。 JDKソースの行は、source
の値はOKです。JDKソースの行は、次のようになります。source
の値はOKです。バイト配列b
をクラスファイルに保存し、デコンパイラでそれを調べたところ、もう一度OKです。もちろんClass.forName()
は全体で同じエラーを報告しますが、本当に面白いことは、私がデバッグモードでname = null
を設定した場合、私はこの獣を得ることです:
java.lang.LinkageError: loader (instance of com/google/gwt/dev/shell/jetty/JettyLauncher$WebAppContextWithReload$WebAppClassLoaderExtension): attempted duplicate class definition for name: "A"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
は、今私は、私はあなたの助けに感謝:(これに完全に無知な感じ問題の。
クラスローダが重要、その場合にはcom.google.gwt.dev.shell.jetty.JettyLauncher.WebAppContextWithReload.WebAppClassLoaderExtension
ある。
アプリケーションを変更して再コンパイルしましたか?もしそうなら、それは何でしたか? –
私に訂正してください:私は実際にアプリケーションのこの部分をテストしていないので、バグが常にそこにあった可能性があります。 – Saintali