web-dev-qa-db-ja.com

ClassNotFoundExceptionを解決する方法

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

Java.lang.ClassNotFoundException:

コロンの後には、欠けているクラスの場所があります。しかし、クラスは他の場所にあるので、その場所は存在しないことを私は知っています。そのクラスのパスを更新するにはどうすればいいですか。クラスパスと関係がありますか?

84
user2426316

あなたのクラスパスは壊れています(これはとてもJavaの世界で一般的な問題です)。

アプリケーションの起動方法によっては、-cpの引数、MANIFEST.MFのクラスパスエントリ、またはディスクレイアウトを修正する必要があります。

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

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

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

2番目の例では、jarファイルの場合、そのクラスのjarファイルを検索します。 jarファイルは、実際には上記のようなディレクトリのzip圧縮されたコレクションです。 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には、クラスパスを指定するためのメニューオプションがあります。

40
user2000590

これが 最良の解決策です これまでに見つけたものです。

クラスを含むorg.mypackageというパッケージがあるとします。

  • HelloWorld(メインクラス)
  • SupportClass
  • UtilClass

このパッケージを定義するファイルは、物理的にはディレクトリD:\myprogram(Windowsの場合)または/home/user/myprogram(Linuxの場合)の下に格納されています。

ファイル構造は次のようになります。 enter image description here

Javaを起動するときに、実行するアプリケーションの名前をorg.mypackage.HelloWorldに指定します。ただし、パッケージを定義するファイルとディレクトリを探す場所をJavaに指示する必要もあります。そのため、プログラムを起動するには、次のコマンドを使用する必要があります。 enter image description here

注:現在の場所に関係なく、上記のJavaコマンドを実行する必要があります。しかし、これはjavacには当てはまりません。コンパイルするには、.Javaファイルがあるディレクトリに直接移動して、javac ClassName.Javaを直接実行することもできます。

10
Ram Patra

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

windowsの場合

Java -classpath .;yourjar.jar YourMainClass

uNIX/Linuxの場合

Java -classpath .:yourjar.jar YourMainClass
6
Juned Ahsan

あなたがmavenを使っているならこれらを試してください。私は自分のプロジェクトにmavenを使用し、mvn clean installを実行してプログラムを実行しようとすると例外がスローされます。それで、私はプロジェクトをきれいにして、そして再びそれを実行します、そして、それは私のために働きます。

私はEclipse IDEを使っています。

Junitテストの実行時にクラスが見つからないという例外が発生した場合は、mvn clean testを1回実行してみてください。それはすべてのテストクラスをコンパイルします。

4
Arun

JarファイルのフルパスをCLASSPATHに追加します。 Linuxではexport CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH"を使ってください。他の方法(CLASSPATHを編集せずに)がうまくいったのは、現在のプロジェクトフォルダにあるjarファイルを解凍することでした。

方法は私のために働いていませんでした:

1)jarファイルのフルパスで-cpオプションを使用します。

2)現在のフォルダーにある場合、jarの名前のみを使用して-cpを使用する

3)jarを現在のプロジェクトフォルダにコピーする

4)jarをJava jarの標準の場所(/ usr/share/Java)にコピーする

この解決法はmysql-connector-Java.5 - *。jarのクラスcom.mysql.jdbc.Driverに対して報告され、OpenJDKバージョン1.7を使ったLinuxで作業しています

3

つかいます ';'セパレータとして。環境変数が正しく設定されていれば、設定が表示されます。 PATHとCLASSPATHが正しい場合、ウィンドウはそれらのコマンドを認識します。 Javaをインストールするときにコンピュータを再起動する必要はありません。

3

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

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

あるいはEclipseなどのIDEを実行している場合は、project -> build path -> configure build pathを右クリックしてクラスを含む外部JARをビルドパスに追加すれば問題なく動作します。

3
invictvs1

私もこれに遭遇し、他の解決策をすべて試しました。 HTMLフォルダに.classファイルがなく、.Javaファイルしかありません。 .classファイルを追加したら、プログラムは正常に動作しました。

2
Jason Robertson
  1. クラスパスが正しくない場合に起こる可能性があります。

  2. シリアライズ可能クラスとデシリアライズ可能クラスを同じプロジェクト名で配置しましょう。特定のフォルダに直列化可能オブジェクトを作成して、直列化可能クラスを実行します。これで、非シリアル化データが必要になりました。それまでの間、プロジェクトの名前を変更しても機能しません。最初にシリアライズ可能クラスを実行してからファイルを逆シリアル化する必要があります。

2

あなたがmavenを使っているなら、すべてのプロジェクトを更新してスナップショットを強制しようと試みてください。それは同様にきれいになり、すべてのクラスパスを再構築します。それは私の問題を解決しました..

2
ibrahimgunes

先頭に移動してimport文がある場合はそれを削除し、クラスを再度インポートします。しかし、そうでない場合は、クリーンにしてからビルドしてください。あなたはNetbeansまたはEclipseを使用していますか?

2
yams

今やりました

1.キャッシュを無効にして再起動する

2問題を解決した私のプロジェクトを再構築しました

2
Jyoti JK

これは、古いバージョンのJava SDKが欠落していて新しいバージョンが存在するJavaの更新後にWindowsで発生する可能性があります。 IDEがインストールされているJava SDKバージョンを使用しているかどうかを確認します(IntelliJ:Ctrl + Shift + Alt + S)。

1
s5s

私はProcessクラスを使用してC#コードから.jarを実行しようとしていました。 JavaコードはEclipseから正常に実行されましたが、C#ビジュアルスタジオからではなく、jarファイルを直接クリックすることもしませんでした。常にClassNotFoundException:例外で停止しました。私のための解決策は、「JARファイル」の代わりに「実行可能なJARファイル」としてJavaプログラムをエクスポートすることでした。誰かに役立つことを願っています。

1
Dani Aya

複数の(サードパーティ)**ライブラリとExtends ** Applicationクラスを追加した場合

それが起こるかもしれません。

そのためには、multiDexEnabled trueを設定し、拡張されたApplicationクラスをMultiDexApplicationに置き換える必要があります。

それは解決されるでしょう。

0
Parth Patel

基本的な一般的な質問 - 最も簡単な一般的な回答;)

情報が与えられれば、私はあなたがコーディング、 "Hello World"のような簡単なコンソールアプリケーションの構築、コンパイル、そして基本的なアプローチを試しているかもしれないという仮定をするでしょう。

このエラーは、次のシナリオで発生します。

..\SomePath>javac HelloWorld.Java
..\SomePath>Java HelloWorld.class

言い換えれば、

..\SomePath>Java HelloWorld

P.Sファイル拡張子.classを追加しても同じ間違いが発生します。また、オペレーティングシステムのEnvironment VariablesのPATHに、Java(JDK/JRE)のbinフォルダがあることを確認してください(詳細については、この記事の他の記事を参照してください)。

0
Vasil