Javaアプリケーションを実行しようとしていますが、次のエラーが発生します。
java.lang.ClassNotFoundException:
コロンの後に、欠落しているクラスの場所が続きます。ただし、クラスが他の場所にあるため、その場所は存在しないことを知っています。そのクラスのパスを更新するにはどうすればよいですか?クラスパスと関係がありますか?
Javaアプリケーションを実行しようとしていますが、次のエラーが発生します。
java.lang.ClassNotFoundException:
コロンの後に、欠落しているクラスの場所が続きます。ただし、クラスが他の場所にあるため、その場所は存在しないことを知っています。そのクラスのパスを更新するにはどうすればよいですか?クラスパスと関係がありますか?
回答:
クラスパスが壊れています(これはJavaの世界で非常に一般的な問題です)。
アプリケーションの起動方法に応じて、への引数-cp
、MANIFEST.MFのClass-Pathエントリ、またはディスクレイアウトを変更する必要があります。
クラスパスは、クラスをロードする場所のリストです。
これらの「場所」は、ディレクトリまたはjarファイルのいずれかです。
ディレクトリの場合、JVMはクラスをロードするための予想されるパターンに従います。私は、ディレクトリがある場合はC:/ MyProjectと/クラスを私のクラスパスに、私はクラスのロードしようとcom.mycompany.Fooを、それが呼ばれるディレクトリのclassesディレクトリの下になります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では、クラスパスを指定するためのメニューオプションがあります。
これは私がこれまでに見つけた最良の解決策です。
org.mypackage
クラスを含むというパッケージがあるとします:
そして、このパッケージを定義するファイルは、ディレクトリD:\myprogram
(Windows)または/home/user/myprogram
(Linux)の下に物理的に保存されます。
Javaを呼び出すときに、実行するアプリケーションの名前を指定しますorg.mypackage.HelloWorld
。ただし、パッケージを定義するファイルとディレクトリの場所をJavaに通知する必要もあります。したがって、プログラムを起動するには、次のコマンドを使用する必要があります。
注:
java
現在の場所に関係なく、上記のコマンドを実行する必要があります。しかし、これはそうではありませんjavac
。コンパイルする場合は、.java
ファイルがあるディレクトリに直接移動して、直接実行することもできjavac ClassName.java
ます。
クラスのパスまたはクラスを含むjarがわかっている場合は、実行中にクラスパスに追加します。ここで説明したようにクラスパスを使用できます。
Windowsの場合
java -classpath .;yourjar.jar YourMainClass
UNIX / Linuxの場合
java -classpath .:yourjar.jar YourMainClass
Mavenを使用している場合は、これらを試してください。私はプロジェクトにmavenを使用してmvn clean install
います。プログラムを実行しようとすると、例外がスローされます。そのため、プロジェクトをクリーンアップして再度実行すると、問題なく機能します。
Eclipse IDEを使用しています。
Junitテストの実行時にClass Not Found Exceptionが発生した場合は、mvn clean test
1回実行してみてください。すべてのテストクラスをコンパイルします。
追加フルパス CLASSPATHにjarファイルのを。Linuxでは次を使用しますexport CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH"
。他の方法(CLASSPATHを編集せずに)は、jarを現在のプロジェクトフォルダーに解凍していました。
方法が私にとってうまくいかなかった:
1)-cp
jarファイルの完全パスでオプションを使用します。
2)-cp
現在のフォルダーにあるときにjarの名前のみで使用する
3)jarを現在のプロジェクトフォルダーにコピーする
4)jarをjava jarの標準の場所にコピーする(/ usr / share / java)
このソリューションは、mysql-connector-java.5-*。jarのクラスcom.mysql.jdbc.Driverについて報告されており、OpenJDKバージョン1.7のLinuxで動作します。
私もこれに遭遇し、他のすべての解決策を試しました。HTMLフォルダーに.classファイルがなく、.javaファイルしかありませんでした。.classファイルを追加すると、プログラムは正常に動作しました。
クラスパスが正しくない場合に発生する可能性があります
シリアライズ可能なクラスとデシリアライズ可能なクラスを同じプロジェクト名で配置してみましょう。シリアライズ可能なクラスを実行して、特定のフォルダーにシリアライズ可能なオブジェクトを作成します。逆シリアル化されたデータが必要です。それまでの間、プロジェクトの名前を変更しても機能しません。最初にシリアライズ可能なクラスを実行してから、ファイルをデシリアライズする必要があります。
基本的な一般的な質問-最も簡単な一般的な回答;)
情報を前提として、単純なテキストエディターとコマンドシェルを使用して、「Hello World」のような単純なコンソールアプリをコーディング、構築、コンパイル、実行するための基本的なアプローチを試みていると仮定します。
このエラーは、休閑期のシナリオで発生します。
..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class
つまり、以下を使用します。
..\SomePath>java HelloWorld
PSファイル拡張子.classを追加しても同じ間違いが発生します。また、Java(JDK / JRE)のbinフォルダーがオペレーティングシステムの環境変数のPATHにあることを確認してください(詳細については、他の投稿を参照してください)PPS私の仮定は正しいですか?
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で膨らんだすべての依存関係が含まれます