ClassNotFoundExceptionを解決するにはどうすればよいですか?


106

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

java.lang.ClassNotFoundException:

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


1
欠落しているクラスを含むjarをclassptahに追加する必要があります
Crom

クラスにパッケージがある場合は、クラスを含むフォルダーに移動します。たとえば、パッケージがパッケージtest.abcの場合、テストの前にフォルダーに移動してから、java -cpを実行します。test.abc.CLASSNAME(.classなし)。パッケージがない場合は、クラスを含むフォルダーに移動してjava -cpと言います。CLASSNAME
オプションで

クラスがランタイムにデプロイされていない(たとえば、jarが欠落している)か、クラスが特定のクラスローダーに表示されない場合は、これらの問題のトラブルシューティングに役立つこのツールを確認してください:jhades.org
Angular University

1
私も時々これに遭遇します。この例外は、例外メッセージにすべての必要なコンテキストを記載するというルールに明らかに違反しています。それはそれが物事を探すことを試みた場所、あなたのクラスパス上にあるものについて言及すべきです より良い例外メッセージを作成してください。問題の解決に役立つ情報を探し回らないでください。
masterxilo 2018年

回答:


32

クラスパスが壊れています(これはJavaの世界で非常に一般的な問題です)。

アプリケーションの起動方法に応じて、への引数-cp、MANIFEST.MFのClass-Pathエントリ、またはディスクレイアウトを変更する必要があります。


33
あなたはもっと日食に特化できますか?私は何をしなければなりませんか?
user2426316 2013

24
質問には、より具体的な回答を提供するのに十分な情報が含まれていません。それを追加することを検討してください。
–ThorbjørnRavn Andersen 2013

依存関係の解決/バージョンの不一致は、基本的にすべてのプログラミング環境で非常に一般的な問題です。どのプログラムもこれまでにそのような定義を解決することだと言えます...問題は常に定義はどこに/どこにあり、どのバージョンを意味しましたか?
masterxilo 2018年

2
Javaの世界に加えて、すべてのソフトウェアが依存関係の正しいバージョンが確実に見つかるようにすることとの戦いがあることを強調します。この問題と考えられる解決策の例として、dll-hell、パッケージマネージャー、バージョンマネージャー、Spring Bootの部品表、Dockerコンテナーを挙げます。外部コードの割合が大きいほど、問題は大きくなります。
masterxilo 2018年

@masterxiloはい、しかし、これは必ずしもここでの問題ではなく、間違ったツリーを吠えているかもしれません。言えることは、クラスパスが壊れているということだけです。
するThorbjörnRavnアンデルセン

45

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

これらの「場所」は、ディレクトリまたは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では、クラスパスを指定するためのメニューオプションがあります。


13

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

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

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

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

ファイル構造は次のようになります。 ここに画像の説明を入力してください

Javaを呼び出すときに、実行するアプリケーションの名前を指定しますorg.mypackage.HelloWorld。ただし、パッケージを定義するファイルとディレクトリの場所をJavaに通知する必要もあります。したがって、プログラムを起動するには、次のコマンドを使用する必要があります。 ここに画像の説明を入力してください

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


6

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

Windowsの場合

java -classpath .;yourjar.jar YourMainClass

UNIX / Linuxの場合

java -classpath .:yourjar.jar YourMainClass

4

Mavenを使用している場合は、これらを試してください。私はプロジェクトにmavenを使用してmvn clean installいます。プログラムを実行しようとすると、例外がスローされます。そのため、プロジェクトをクリーンアップして再度実行すると、問題なく機能します。

Eclipse IDEを使用しています。

Junitテストの実行時にClass Not Found Exceptionが発生した場合は、mvn clean test1回実行してみてください。すべてのテストクラスをコンパイルします。


「mvn clean test」を実行したとき、どのディレクトリにいましたか?POMと同じディレクトリにありますか?
TacoB0t

1
はい。pomファイルが存在するディレクトリから実行しました。
2018年

3

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

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

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


3

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


5
それはWindows(セミコロン)で、UNIX / Linuxでは ':'(コロン)
Joeblade

3

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

方法が私にとってうまくいかなかった:

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

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で動作します。


JARの解凍のみが機能し、他のソリューションは機能しませんでした
OverCoder

2

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


2

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


2
  1. クラスパスが正しくない場合に発生する可能性があります

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


2

mavenを使用している場合は、すべてのプロジェクトをmavenで更新して、スナップショットを強制してください。それもクリーンアップし、すべてのクラスパスを再構築します。問題は解決しました。


2

今やりました

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

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


1

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


1

これは、Javaのアップデート後に古いバージョンのJava SDKがなく、新しいバージョンが存在するWindowsで発生する可能性があります。IDEがインストールされているJava SDKバージョン(IntelliJ:CTRL + SHIFT + ALT + S)を使用しているかどうかを確認します


1

複数の(サードパーティ)**ライブラリを追加し、**アプリケーションクラスを拡張した場合

その後、それが発生する可能性があります。

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

解決されます。


1

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

情報を前提として、単純なテキストエディターとコマンドシェルを使用して、「Hello World」のような単純なコンソールアプリをコーディング、構築、コンパイル、実行するための基本的なアプローチを試みていると仮定します。

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

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

つまり、以下を使用します。

..\SomePath>java HelloWorld

PSファイル拡張子.classを追加しても同じ間違いが発生します。また、Java(JDK / JRE)のbinフォルダーがオペレーティングシステムの環境変数のPATHにあることを確認してください(詳細については、他の投稿を参照してください)PPS私の仮定は正しいですか?


1

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で膨らんだすべての依存関係が含まれます


@Architが追加されました。
techkuz

0

私の場合、クラスが見つからないという例外としてスローされたクラスには、SSL証明書に関連するプロパティがあります。日食を閉じ、「管理者として実行」として開いて、問題を解決しました。Eclipseには問題に関連する権限があるため、この種の例外がスローされます。


-7

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

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
これは例外を解決しません。これは例外を隠します。さらに、「e1.getmessage()」は、a)getMessage()の大文字の誤り、およびb)メッセージ付きの文字列を返し、それを印刷したり、ログに記録したりしないため、あまり機能しません。
IBBoard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.