2011-12-07 9 views
1

学校での割り当てには、あらかじめ定義されたものを実装するクラスBlenderを作成する必要があります。私はimagecompositor.jarのJARファイルを受け取り、すべてを行い、Blenderクラスを使用します。 JARファイルには2つのクラス(ImageCompositor.classStDraw.class)が含まれています。プログラムを実行するにはJava NoClassDefFoundError

、先生は、私は次のことを実行する必要があると言う:

java -cp ... ass3.ImageCompositor img1 img2 offsetx offsety 

私はJavaのコーディングする方法を知っています。外部クラスをJARファイルに読み込む方法がわかりません。

java -cp imagecompositor.jar ass3.ImageCompositor img1.png img2.png 0 0 

が、それは NoClassDefFoundErrorを投げた:だから私はこれを試してみました

Exception in thread "main" java.lang.NoClassDefFoundError: ass3/Blender 
at ass3.ImageCompositor.main(ImageCompositor.java:113) 

Blenderクラスがそれに行package ass3を持っています。私は間違って何をしていますか?

あなたがクラスパスにあなたのBlenderクラスを追加する必要があります

+0

ImageCompositorの113行目はどうなっていますか? java.lang.NoClassDefFoundErrorは通常、いくつかの静的コンストラクターが失敗します。 stacktraceをもっと理解するためには、ImageCompositorのコンストラクターチェーンが何を作るかを理解する必要があります。 –

+0

私たちは割り当てのソースコードを取得しません。私たちはjarファイルしか取得しないので、そこで何が起こるかは分かりません。しかし、おそらくBlender blender =新しいBlender()です。 Blenderのクラス定義が見つからないという不満がある場所です。 – Fatso

+0

例外メッセージはどこで確認できましたか?一般的にスタックトレースはその直後に出てきます。 –

答えて

0

など、私はより多くの情報を与えたいと思うが、私は、スタックトレースを取得する方法がわかりません。

コマンドライン

java -cp imagecompositor.jar ... 

はimagecompositor.jarのクラスパスを使用します。これは、Java仮想マシン(JVM)にjarファイルを調べるように指示します。 JVMに指示しないと、クラスを探すことです。あなたが使用する必要があり、あなたはjarファイルにそれらをパッケージ化している場合は、

java -cp imagecompositor.jar;myclasses.jar ... 

を行う必要がありますし、.classファイルがルートディレクトリpath/to/someRootとツリーにある場合(例えばクラスass3.Blenderpath/to/someRoot/ass3/Blender.classにする必要があります)同じ構文が、ルートディレクトリではなく、.jarファイル(私はこれが正しいと考える、ドキュメントを見つけることができません)と:ブレンダークラスが配置されている

java -cp imagecompositor.jar;path/to/someRoot ... 
+0

解決策は、java.lang.ClassNotFoundExceptionを修正しますが、java.lang.NoClassDefFoundErrorは修正しません。 java.lang.NoClassDefFoundErrorは通常、いくつかの静的コンストラクターが失敗したものです。これを理解しようとするために、スタックトレースをもっと必要とします。 –

+0

興味深い.... –

+0

真、ボブ。私は実際にこれを既に試してみましたが、うまくいきませんでした(同じエラーを出します)。また、jarファイルをコロンで区切る必要があります。 – Fatso

0

?正しく見つかるためには、あなたのBlenderクラス(パッケージ "ass"内)は現在のディレクトリに対して "ass"という名前のディレクトリになければなりません。現在のディレクタ.をデフォルトのクラスパスから削除しない場合は、クラスパスを変更する必要はありません。

しかしは、あなたのケースでは、あなたは(付属のjarファイルを指定するために)クラスパスを変更する必要があり、コマンドがパスから.を削除しない自分の投稿に記載されています。だから、次の操作を行う必要があります

java -cp whatever.jar;. whatever_other_parameters 

(注意「;」-CP引数に追加されます。)これは、クラスパスに戻って、現在のディレクトリを置きます。

+0

解決策は、java.lang.ClassNotFoundExceptionを修正しますが、java.lang.NoClassDefFoundErrorは修正しません(Jasonの回答に同じ問題があります)。 java.lang.NoClassDefFoundErrorは通常、いくつかの静的コンストラクターが失敗したものです。これを理解しようとするために、スタックトレースをもっと必要とします。 –

+0

ええ、NoClassDefFoundErrorは、わずかな少数のケースで名前の付いたクラスが完全に欠落していることが原因です。多くの場合、別のクラスが見つからない、クラスのバージョンが一致しない、または静的な初期化の問題が原因です。それを整理するには、少なくとも最初の10行程度のトレースバックが必要です。 –

+0

ありがとうBob :)、それは本当です。過去にこれも試してみましたが、うまくいきませんでした。 – Fatso

0

java.lang.NoClassDefFoundErrorは通常、静的コンストラクターでは失敗します。あなたのクラスを全く見つけられなかった場合、JVMはjava.lang.ClassNotFoundExceptionを発します。あなたの質問の説明から、私は、コマンドラインを考えています:

imagecompositor.jarファイルは、我々はjavaコマンドを実行している場所と同じディレクトリにあると仮定している
java -cp imagecompositor.jar ass3.ImageCompositor img1 img2 offsetx offsety 

。これはjavaコンパイラにimagecompositor.jar内のすべてをクラスローダが利用できるようにして、ass3パッケージにあるImageCompositorというクラスをロードしています。また、ImageCompositorに静的メインメソッドがあると仮定しています。これは、Javaがコマンドラインからどのように実行されるかを示しています。

関連する問題