0

test.classを実行すると、次のエラーが発生します。

Exception in thread "main" java.lang.NoSuchMethodError: ml.Temp.<init>(Ljava/lang/String;II)V
    at test.main(test.java:11)

そしてここにtest.javaのコードがあります

import java.io.*;
import ml.*;

class test
{
        public static void main(String[] args) throws FileNotFoundException, IOException
        {
                String filename = "input";

                Temp id = new Temp(filename, 6, 100);
                    id.someFunction();          
         }
}

基本的に、Temp.classを含むjarファイルがあります(Tempは私が作成したライブラリファイルであり、mlパッケージの下にあります)。Tempには、これら3つの引数とパブリックsomeFunctionを受け取るコンストラクターがあります。

これが役立つかどうかはわかりませんが、コンパイル中にjarファイルのクラスパスを含めました。test.classの実行中にjarファイルのクラスパスを含めると、次のようになります。

Exception in thread "main" java.lang.NoClassDefFoundError: test
Caused by: java.lang.ClassNotFoundException: test
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: test. Program will exit.

編集:

それが役立つ場合は、次のようにコンパイルしました(ml.jarとtest.javaは同じディレクトリにあります)

javac -cp ml.jar test.java
4

3 に答える 3

1

私はあなたのふりをして、プロセス全体を実行します。

1 - 図書館。私は、たとえば、というディレクトリにいworkspaceます。その中に、 というディレクトリを作成しましたml
ディレクトリ内に、例として次のようmlな新しいファイルを作成しました。Temp.java

package ml;

public class Temp
{
    public Temp(String filename, int arg1, int arg2)
    {
        //do something
    }

    public void someFunction()
    {
        //do something else
        System.out.println("look left!");
    }
}

次に、ライブラリ クラスをコンパイルし、ライブラリ jar を作成します。まず、実行してコンパイルします

javac ./Temp.java

mlディレクトリ内。workspace次に、1 つのディレクトリをそのディレクトリまで移動して実行し、ライブラリを jar します。

jar cf ml.jar ml/

2 - プログラム。Test.javaここで、ディレクトリ内にファイルを作成しますworkspace。ファイルには次のものが含まれます。

import java.io.*;
import ml.*;

public class Test
{
    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        String filename = "input";

        Temp id = new Temp(filename, 6, 100);
        id.someFunction();
    }
}

3 - 結果。次に、テスト プログラムのコンパイルと実行に進みます。workspace私が実行するディレクトリ内:

javac -cp ./:ml.jar ./Test.java

workspaceディレクトリ内で次のコマンドを実行することで、最終的にプログラムを実行できます。

java -cp ./:ml.jar Test

出力は次のようになります。

look left!

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

于 2012-02-09T18:15:49.770 に答える
1

java -cp <path-to-ml.jar> testが存在するパスからコマンドを実行する必要がありtest.classます。

編集

NoSuchMethodError、class の 11 行目で、存在しない署名 ( ) を持つ(not !)testのコンストラクターを使用しようとしていることを示しています。クラスパスにないという意味ではありません。ml.ID3TempString, int, intNoClassDefFoundError

一方、あなたのクラスパスにもうないNoClassDefFoundError: testことを意味します。testjar をクラスパスに追加しても、これだけで を取得できたNoClassDefFoundError: testとしても、クラスパスから消えることはありませんtest...そのため、他の不注意な操作を行った可能性が高くなります。

編集2

そのコンストラクターはID3開発環境で使用されている可能性がありますが、ランタイム環境には明らかに存在しません。それがサードパーティのjatである場合、そのjarの2つのバージョンがあり、1つは開発で使用され、もう1つは実行時に使用される可能性があります。または、ランタイム環境に両方が表示されることもありますが、コンストラクター ツールの優先順位が欠けている場合もあります。

于 2012-02-09T08:00:41.070 に答える
1

ソースコードなしで何が起こったのかを正確に伝えるのは難しいですが、ライブラリとそれを使用しているプロジェクトが同期していないようです. ライブラリ/プロジェクト内のメソッドのシグネチャを変更しましたか? すべてを再コンパイルしてから、クラスtestが再コンパイルしたライブラリの最新バージョンを使用しているかどうか、および宣言されているかどうかを確認することをお勧めしますpublic

読み方NoSuchMethodErrorなどに関するより有用な情報は、こちらの素晴らしい記事にあります: http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/

于 2012-02-09T08:01:45.593 に答える