2012-02-09 11 views
0

私はtest.classを実行すると、私は次のエラーを取得する:NoSuchMethodErrorとNoClassDefFoundErrorの原因は何ですか?

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ファイルを持っている(温度がされています私が書き、mlパッケージの下にあるライブラリファイル)。 Tempには、これら3つの引数とpublic someFunctionをとるコンストラクタがあります。

コンパイル中にjarファイルのクラスパスを追加しましたが、これが役立つかどうかはわかりません。

次のように、それは私がコンパイルできます場合は(ml.jarとtest.javaはしている:私は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. 

EDITを取得します同じディレクトリ)

javac -cp ml.jar test.java 
+0

これはどのように構築/実行していますか? –

+0

最初のエラーの場合、私はちょうどJavaテストを行いました。 java -cp "ml.jar"テストを実行すると2番目のエラーが発生します – Hari

答えて

1

あなたはtest.classが置かれているパスからコマンドjava -cp <path-to-ml.jar> testを実行する必要があります。

NoSuchMethodError EDITは、あなたが署名(String, int, int)とml.ID3(ないTemp!)のコンストラクタを使用しようとしているtestクラスの11行目にそれが存在しないことを示しています。クラスパスにないことを意味するわけではありません。その結果、NoClassDefFoundErrorになります。

一方、NoClassDefFoundError: testは、testがあなたのclsspathにもう存在しないことを意味します。 jarをクラスパスに追加すると、実際にNoClassDefFoundError: testを得ることができない場合、はクラスパスから消えるようになります...他の不注意な操作を行った可能性が高くなります。

EDIT 2

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

+0

はい、test.classが存在する場所から実行しました。または、あなたは何らかの意味でTemp.classを意味しますか? – Hari

+0

いいえ、Temp.classは 'path-to-ml.jar'で参照されるjarファイル内になければなりません。 – yair

+0

はい、その場合 - 私はtest.classと同じパスから実行します。 – Hari

1

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

NoSuchMethodErrorなどの読み方について

もっと有用な情報がここで素晴らしい記事で見つけることができます:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/

1

私はあなたのことが、全体のプロセスを通過するふりをするつもりです:

1 - ライブラリ。私は、例えばworkspaceというディレクトリにいます。その中にmlというディレクトリを作成しました。私は今、ライブラリのクラスをコンパイルして、ライブラリのjarを作成するつもりです

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!"); 
    } 
} 


mlディレクトリ内私は例のため、以下が含まれ、Temp.javaと呼ばれる新しいファイルを作成しました。 まず私はmlディレクトリ内

javac ./Temp.java 

を実行してコンパイルします。 - プログラム

jar cf ml.jar ml/ 

2:その後、私はworkspaceディレクトリと実行までの1つのディレクトリを行くことによって、ライブラリをjarファイル。 workspaceディレクトリ内にTest.javaファイルを作成します。このファイルには、次の情報が含まれています。

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ディレクトリ内に次のコマンドを実行して、プログラムを実行することができます。

look left! 

:出力を示すだろう

java -cp ./:ml.jar Test 

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

関連する問題