136

Java アプリケーションを実行しようとしていますが、次のエラーが発生します。

java.lang.ClassNotFoundException:

コロンの後には、欠落しているクラスの場所が続きます。ただし、クラスは別の場所にあるため、その場所が存在しないことはわかっています。そのクラスのパスを更新するにはどうすればよいですか? クラスパスと関係がありますか?

4

27 に答える 27

53

クラスパスは、クラスをロードする場所のリストです。

これらの「場所」は、ディレクトリまたは jar ファイルのいずれかです。

ディレクトリの場合、JVM は予想されるパターンに従ってクラスをロードします。クラスパスにディレクトリC:/myproject/classesがあり、クラスcom.mycompany.Fooをロードしようとすると、クラス ディレクトリの下でcomというディレクトリが検索され、その下でmycompanyというディレクトリが検索され、最後に、そのディレクトリでFoo.classというファイルを探します。

2 番目のインスタンスでは、jar ファイルの場合、そのクラスの jar ファイルを検索します。jar ファイルは実際には、上記のようなディレクトリの圧縮されたコレクションにすぎません。jar ファイルを解凍すると、上記のパターンに従って一連のディレクトリとクラス ファイルが得られます。

そのため、JVM は、クラス定義をロードしようとするときに、クラスの定義を探してクラスパスを最初から最後までトラバースします。たとえば、クラスパスでは次のようになります。

C:/myproject/classes;C:/myproject/lib/stuff.jar;C:/myproject/lib/otherstuff.jar

JVM は、最初にディレクトリクラスを検索し、次にstuff.jarを検索し、最後にotherstuff.jarを検索しようとします。

ClassNotFoundException が発生した場合は、JVM がクラスパス全体をトラバースしたが、参照しようとしたクラスが見つからなかったことを意味します。解決策は、Java の世界ではよくあることですが、クラスパスを確認することです。

コマンド ラインでjava -cpと言ってからクラスパスを指定して、クラスパスを定義します。Eclipse などの IDE には、クラスパスを指定するメニュー オプションがあります。

于 2013-07-01T16:20:52.440 に答える
9

クラスまたはクラスを含む jar のパスがわかっている場合は、実行中にそれをクラスパスに追加します。ここに記載されているように、クラスパスを使用できます。

Windows の場合

java -classpath .;yourjar.jar YourMainClass

UNIX/Linux の場合

java -classpath .:yourjar.jar YourMainClass
于 2013-07-01T16:00:15.033 に答える
4

Maven を使用している場合は、このプラグインが にあることを確認してくださいpom.xml

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

依存関係 (例外の理由) を jar に配置します。

FYI : これには、最終的な jar で膨らんだすべての依存関係が含まれます

于 2019-12-13T13:33:41.063 に答える
3

コマンド ライン経由でクラスの場所をクラスパスに追加するには、クラスの実行中に、-cpまたはクラスの場所を追加するだけ-classpathです。IE

java -cp "c:/location/of/file" YourProgram

または、Eclipse などの IDE を実行している場合は、右クリックしてproject -> build path -> configure build path 、クラスを含む外部 JAR をビルド パスに追加すると、正常に動作するはずです。

于 2013-07-01T16:05:26.443 に答える
2

私もこれに遭遇し、他のすべてのソリューションを試しました。HTML フォルダーに .class ファイルがなく、.java ファイルしかありませんでした。.class ファイルを追加すると、プログラムは正常に動作しました。

于 2014-01-13T15:35:57.287 に答える
2

上部に移動して、インポート ステートメントがあれば削除し、クラスを再インポートします。しかし、そうでない場合は、クリーンアップしてからビルドしてください。Netbeans または Eclipse を使用していますか?

于 2013-07-01T16:04:57.467 に答える
1

同じエラーが発生し、依存関係の競合の問題であることに気付くのに丸一日かかりました。

  • 2 つのライブラリをインポートABました。
  • と の両方が別のライブラリAB依存してCいますが、 のバージョンが異なりますCAに依存しC 1.0B依存しているとしましょうC 2.0
  • Bにのみ存在するクラスを利用しC 2.0ます。
  • ただし、A依存関係ツリーでは「より近い」ため、Maven はandと andC 1.0の両方を使用し、これについて警告することさえありません (私にとっては非常に驚くべきことです)。AB
  • その結果、 にBのみ存在するクラスを使用しようとするとC 2.0、 aClassNotFoundExceptionがスローされます。

奇妙なことBに、IDE で のコードをナビゲートし、 にのみ存在するクラスにジャンプしようとするとC 2.0、正しく動作します。C 2.0実際にインストールされており、IDE はそれを認識していますが、アプリケーションの実行時には無視されます。

これは本当に私を狂わせました...

の代わりに選択できるようC 2.0に、 myに追加する必要がありました。pom.xmlC 1.0

Maven が最も近い依存関係を選択する方法については、この投稿を参照してください: https://stackoverflow.com/a/63815140/7438905

mvn dependency:tree依存関係ツリーを視覚化するために使用できます。

于 2021-11-07T15:36:19.163 に答える
-11

すべてのコードを try ブロックに入れてから、catch ブロックで例外をキャッチします

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}
于 2015-02-23T15:53:21.953 に答える