Java アプリケーションを実行しようとしていますが、次のエラーが発生します。
java.lang.ClassNotFoundException:
コロンの後には、欠落しているクラスの場所が続きます。ただし、クラスは別の場所にあるため、その場所が存在しないことはわかっています。そのクラスのパスを更新するにはどうすればよいですか? クラスパスと関係がありますか?
Java アプリケーションを実行しようとしていますが、次のエラーが発生します。
java.lang.ClassNotFoundException:
コロンの後には、欠落しているクラスの場所が続きます。ただし、クラスは別の場所にあるため、その場所が存在しないことはわかっています。そのクラスのパスを更新するにはどうすればよいですか? クラスパスと関係がありますか?
クラスパスは、クラスをロードする場所のリストです。
これらの「場所」は、ディレクトリまたは 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 には、クラスパスを指定するメニュー オプションがあります。
クラスまたはクラスを含む jar のパスがわかっている場合は、実行中にそれをクラスパスに追加します。ここに記載されているように、クラスパスを使用できます。
Windows の場合
java -classpath .;yourjar.jar YourMainClass
UNIX/Linux の場合
java -classpath .:yourjar.jar YourMainClass
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 で膨らんだすべての依存関係が含まれます
コマンド ライン経由でクラスの場所をクラスパスに追加するには、クラスの実行中に、-cp
またはクラスの場所を追加するだけ-classpath
です。IE
java -cp "c:/location/of/file" YourProgram
または、Eclipse などの IDE を実行している場合は、右クリックしてproject -> build path -> configure build path
、クラスを含む外部 JAR をビルド パスに追加すると、正常に動作するはずです。
私もこれに遭遇し、他のすべてのソリューションを試しました。HTML フォルダーに .class ファイルがなく、.java ファイルしかありませんでした。.class ファイルを追加すると、プログラムは正常に動作しました。
上部に移動して、インポート ステートメントがあれば削除し、クラスを再インポートします。しかし、そうでない場合は、クリーンアップしてからビルドしてください。Netbeans または Eclipse を使用していますか?
同じエラーが発生し、依存関係の競合の問題であることに気付くのに丸一日かかりました。
A
しB
ました。A
にB
依存してC
いますが、 のバージョンが異なりますC
。A
に依存しC 1.0
、B
依存しているとしましょうC 2.0
。B
にのみ存在するクラスを利用しC 2.0
ます。A
依存関係ツリーでは「より近い」ため、Maven はandと andC 1.0
の両方を使用し、これについて警告することさえありません (私にとっては非常に驚くべきことです)。A
B
B
のみ存在するクラスを使用しようとするとC 2.0
、 aClassNotFoundException
がスローされます。奇妙なことB
に、IDE で のコードをナビゲートし、 にのみ存在するクラスにジャンプしようとするとC 2.0
、正しく動作します。C 2.0
実際にインストールされており、IDE はそれを認識していますが、アプリケーションの実行時には無視されます。
これは本当に私を狂わせました...
の代わりに選択できるようC 2.0
に、 myに追加する必要がありました。pom.xml
C 1.0
Maven が最も近い依存関係を選択する方法については、この投稿を参照してください: https://stackoverflow.com/a/63815140/7438905
mvn dependency:tree
依存関係ツリーを視覚化するために使用できます。
すべてのコードを try ブロックに入れてから、catch ブロックで例外をキャッチします
try
{
// code
}
catch(ClassNotFoundException e1)
{
e1.getmessage();
}