2

次のようになりますNoClassDefFoundError。これは、クラスがライブラリjarにすでに存在するため奇妙です。

Exception in thread "main" java.lang.NoClassDefFoundError: abc/test/Test.java
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:795)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:75)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:294)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:288)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:287)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:327)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:795)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:75)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:294)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:288)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:287)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:327)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:432)
Caused by: java.lang.ClassNotFoundException: abc.test.Test
        at java.net.URLClassLoader$1.run(URLClassLoader.java:299)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:288)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:287)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:327)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 25 more

これは、例外を引き起こしている同じクラスを見つけることができないようです。ライブラリパスもantbuild.xmlに含めました。これは、以下で確認できます。

<property name="deps" value="${lib}/abclib/abclib-test.jar"/>

<target name="dist" depends="compile">
        <manifest file="${dist}/MANIFEST.MF">
            <attribute name="Main-Class" value="xyz.test.TestConfiguration" />
            <attribute name="Class-Path" value="${deps}"/>
        </manifest>
        <jar jarfile="${dist}/abc.jar" basedir="${build}/" manifest="${dist}/MANIFEST.MF" />
</target>

私は迷子になっています、少なくとも誰かが私をどこを見るべきか、または私が間違っているかもしれないことを私に導くことができますか?

また、誰かが「例外」と「原因」の光を投げることができますか。私はそれらがどのように関連しているのかよくわかりません。

4

6 に答える 6

7

関数で静的フィールドを初期化すると、明らかにするのが難しくなる場合がありますNoClassDefFoundError

例:次のようなことをするとき:

public class SomePanel extends Panel {
    static int CALC_VALUE = ValueCalcUtils.calcValue();
    ...

...どこ

ValueCalcUtils.calcValue()

... 例外をスローします。

次に、例外がスローされると、次のようになります。

  1. 実際の問題(ValueCalcUtils.calcValue()何らかの理由で例外をスローした)を示すエラーが 1 つ表示されます。
  2. その後 のインスタンスを作成しようとすると、(誤解を招く) forSomePanelがスローされます。NoClassDefFoundErrorSomePanel

これは、最初にクラス定義を作成しようとしたときに を初期化できなかったことを JVM が記憶しているため、再度要求されたときにSomePanel「クラス定義がありません」( NoClassDefFoundError) になるためです。SomePanel

Wicket/Tomcat の状況では ...

Tomcat-Webserver 上の Wicket-Application でこの正確な問題が発生しました。問題は、静的な Utils-Method が依存していたことWicketApplication.get()です。

これがほとんどの場合に機能する場合、Tomcat が起動時に SessionStore から古いセッションを復元しようとしたときに、説明されている問題が発生します。セッションには、問題のパネルのシリアル化されたインスタンスが含まれることがありました。Panel-Class を初期化するときに、Tomcat の起動時にWicketApplicationがまだ存在していなかったため、例外が発生しました。NoClassDefFoundErrorその後、明確な理由もなく、アプリケーション ログに Panel に関する多くの紛らわしいs がありました。

tomcat-stderror.logファイルに「ルート エラー」の単一の出現が最終的に見つかりました。これは、Tomcat が起動時に最初のエラーをスローしたためです。

これが誰かに役立つことを願っています。

于 2013-11-14T10:13:09.217 に答える
5

別のSOエントリNoClassDefFoundErrorとの違いについては本当に良い説明があります:ClassNotFoundException

...クラスがCLASSPATHにないことを意味するものではありません。実際、その正反対です。これは、クラス...がClassLoaderによって検出されたことを意味しますが、クラスをロードしようとすると、クラス定義の読み取り中にエラーが発生しました。これは通常、問題のクラスに、ClassLoaderによって検出されないクラスを使用する静的ブロックまたはメンバーがある場合に発生します。したがって、原因を見つけるには、問題のクラスのソースを表示し、静的ブロックまたは静的メンバーを使用してコードを探します。

Test.javaのコードを調べて、何がインポートされるかを把握し、それらのクラスがクラスパス上にあることを確認する必要があります。クラスの追跡についてサポートが必要な場合は、Test.javaのコードを投稿できます。

于 2012-09-26T17:44:48.560 に答える
1

Class-PathエントリにMANIFEST.MFは特定の形式があります。特に、クラスパスのエントリは相対URI(マニフェストを含むJARの場所に対して)である必要があります。Antには、適切なクラスパスの構築を支援するmanifestclasspathタスクがあります。

<target name="dist" depends="compile">
    <property name="jar.location" location="${dist}/mcon.jar"/>
    <manifestclasspath property="manifest.class.path" jarfile="${jar.location}">
      <classpath>
        <pathelement location="${deps}" />
      </classpath>
    </manifestclasspath>
    <manifest file="${dist}/MANIFEST.MF">
        <attribute name="Main-Class" value="xyz.test.TestConfiguration" />
        <attribute name="Class-Path" value="${manifest.class.path}"/>
    </manifest>
    <jar jarfile="${jar.location}" basedir="${build}/" manifest="${dist}/MANIFEST.MF" />
</target>

これは正しい形式で設定する必要がClass-Pathあります(おそらく../lib/abclib/abclib-test.jarあなたの例のようなもの)

于 2012-09-26T17:26:31.080 に答える
1

ClassNotFoundExceptionNoClassDefFoundError..の間には違いがあります。

1 つはあなたが使用していることをfirst示しますが、classclasspath

Second1 つは、使用している が、クラスパスにないclass別のものを使用していることを示します。class

したがって、問題は、クラスパスにクラスがないことではありません..しかし、問題は、classesクラスが依存している がクラスパスにないことです..ここで、 all が何をするかを確認する必要がありclassesますclassコードで現在使用されているもの) は、..

于 2012-09-26T16:43:56.467 に答える
0

NoClassDefFoundErrorクラスローダーがクラスの定義をロードできない結果としてスローされます。クラスパス上にあるクラスの正しいパスが指定されていることを確認してください。ライブラリがクラスパスにあることを確認します。MANIFEST.MFライブラリが に存在するように変更しますClass-Path。コマンド ライン -cp スイッチを指定して java を実行し、クラスパス上のライブラリを指定します。

于 2012-09-26T17:07:16.627 に答える
0

NoClassDefFoundError は、実行時の実行時ではなく、コンパイル時にクラスが存在したことを意味します。したがって、他の人が示唆しているように、コンパイル時ではなく実行時に使用されているクラスパスを理解する必要があります。

于 2012-09-26T16:58:06.807 に答える