5

Main.javaというJavaプログラムがあります。これは次のディレクトリにあります。

/home/user/program/Main.java

'program'ディレクトリからMain.javaを実行しようとすると、すべて問題なく動作します。次の行を使用します。

/home/user/program$ java Main

しかし、ホームディレクトリからMain.javaを実行しようとすると:

/home$ java /home/user/program/Main

私は得る:

Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main

このエラーの原因は何ですか?

4

8 に答える 8

10

これは、デフォルトで現在のディレクトリに設定されるクラスパスが原因です。java Mainから実行する/home/user/programと、現在のディレクトリでクラスが見つかります(パッケージが設定されていないように見えるため、これがデフォルトです)。したがって、でクラスが見つかり/home/user/program/Main.classます。

java /home/user/program/Mainfromを実行する/homeと、クラスパス(現在のディレクトリ)でクラスを検索しようとします。クラスパスは、パッケージを含むクラスの定義を含む/home/home/user/programファイルを検索することを期待しています。Main.classMain.home.user.program

追加の詳細:Javaランチャーは、クラス名の/-表記を.-表記に変換することで、うまく機能しようとしていると思います。実行 java /home/user/program/Mainすると、実際に実行java .home.user.program.Mainされます。これは、ファイルを指定するのではなく、完全に指定されたクラス名(つまり、パッケージ指定子を含む)を指定する必要があるためです。また、クラスにパッケージがある場合、javaは、クラスパスのディレクトリ(またはjar)内で、パッケージ名と一致するディレクトリ構造内でそのクラスを見つけることを期待します。したがって、 /home/home/user/programクラスファイルを検索しようとします

-cpまたはでクラスパスを指定することで修正できます-classpath

java -cp /home/user/program Main
于 2011-03-21T10:30:39.393 に答える
3

指定したフルネーム(/ home / user / program / Main)を使用してクラスを検索するためです。Mainクラスのみを検索する必要がありますが、適切なクラスパスを使用してください:java Main -cp / home / user / program

つまり、指定されたパスのセットでMainクラスを検索します

于 2011-03-21T10:28:36.743 に答える
0

2番目のコマンドバージョンは、クラスの場所を認識していません。いわゆるクラスパスを提供する必要があります

/home$ java -cp userprogram Main
于 2011-03-21T10:29:47.640 に答える
0

あなたの言うことから、私はこれを結論付けます:

  • メインは「トップ」(ルート)パッケージにあります

また、Javaを実行するときは、クラスパスを指定する必要があります。これは、パッケージとクラスの構造が配置されているルートディレクトリです。

あなたの場合、それはまさに/ home / user/programです。そして、あなたのクラスパスは「。」として定義されていると思います。(あなたがいるディレクトリ)。自宅からjavaを呼び出すと、クラスパスが誤って取得されます。

別のパッケージを使用してメインを呼び出す場合は、クラスの先頭でパッケージを宣言します。

package user.program;

そして、クラスパスを/ homeに設定します(またはそのディレクトリからjavaを実行します)。次に、次のようにjavaを呼び出します。

java user.program.Main

完全なクラス名(パッケージを示す)であるため、ドットを使用します。これは、クラスパス+パッケージ+クラスを連結するdirsに変換されます。例:

/home
user.program -> user/program/
Main         -> Main.class

幸運を!

于 2011-03-21T10:31:38.470 に答える
0

java /home/user/program/Main問題は、パッケージを呼び出すと、Mainがであることが意図されていることですhome.user.program。これは当てはまらないと思いますMain(デフォルトのパッケージにあると思います。つまり、まったくありません)。package上部に宣言はありMainますか?

他の回答ではクラスパスの提案を使用することをお勧めします。

于 2011-03-21T10:34:06.850 に答える
0

これは私のために働きます:

java -cp / home / user / program Main

于 2011-03-21T10:35:07.340 に答える
0

少し前に、この種のエラー(NoClassDefFoundError)に直面しました。Eclipseenvを使用してAndroidアプリにサードパーティのライブラリをインポートしました。実行時にこのエラーが発生しました-言及されたライブラリがクラスパスに正しく表示されているにもかかわらず、このサードパーティライブラリの一部のクラスが見つからず、このNoClassDefFoundErrorの結果がスローされたため、他に何ができるか本当にわかりませんでしたこの問題を解決するために。「Javaビルドパス」内の「注文とエクスポート」タブで遊んでいるときに、インポートしたサードパーティライブラリをプロジェクト内のすべてのライブラリのリストの一番上に置き、チェックボックスをオンにしました。これで問題が解決しました。

于 2013-07-06T20:02:31.533 に答える
0

コンパイルして実行しようとすると、これと同じエラーが発生しました。「HeadFirstJava」という本は、この問題を適切に説明し、対処しています。参考までに、この本のスクリーンショットを次に示します。

パッケージ名を含めてJavaプログラムをコンパイルおよび実行する方法についてのHeadFirstJavaのスクリーンショット。

お役に立てば幸いです。

于 2013-09-13T08:51:05.087 に答える