メインクラスのエラーを検出またはロードできませんでした

1. 前書き

Javaプログラムを実行すると、「メインクラスが見つからないか、ロードできませんでした」と表示されることがあります。 理由を推測するのは簡単です。JVMはメインクラスを見つけられず、このエラーを出しました。 しかし、なぜできなかったのでしょうか?
このチュートリアルでは、メインクラスを見つけられなかったと思われる理由について説明します。 また、それらを修正する方法も見ていきます。

2. サンプルプログラム

_HelloWorld_プログラムから始めます。
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world..!!!");
    }
}
それではコンパイルしましょう:
$ javac HelloWorld.java
ここで、コンパイラはプログラムの_.class_ファイルを生成します。 この_.class_ファイルは同じディレクトリに生成されます。 * _.class_ファイルは、Javaプログラムで指定されたクラス名と同じ名前になります。*この_.class_ファイルは実行可能です。
次のセクションでは、この_.class_ファイルを実行し、「メインクラスを見つけられないかロードできませんでした」というエラーの考えられる理由を理解しようとします。

3. 間違ったクラス名

Javaコンパイラによって生成された_.class_ファイルを実行するには、次のコマンドを使用できます。
java <.class filename>
それでは、プログラムを実行しましょう。
$ java helloworld
Error: Could not find or load main class helloworld
ええ、「メインクラスhelloworldを見つけられないか、ロードできませんでした」というエラーで失敗しました。
前述のように、*コンパイラは、プログラム内のJavaクラスに指定されたものとまったく同じ名前で_.class_ファイルを生成します*。 したがって、この場合、メインクラスの名前は_helloworld_ではなく_HelloWorld_になります。
正しいケーシングでもう一度試してみましょう:
$ java HelloWorld
Hello world..!!!
今回は正常に実行されました。

3.1. ファイル拡張子

Javaプログラムをコンパイルするには、ファイル名に拡張子(._java_)を指定する必要があります。
$ javac HelloWorld.java
ただし、._ class_ファイルを実行するには、ファイル名ではなくクラス名を指定する必要があります。 したがって、_.class_拡張機能を提供する必要はありません。
$ java HelloWorld.class
Error: Could not find or load main class HelloWorld.class
それでは、正しいクラス名を使用してプログラムを実行しましょう。
$ java HelloWorld
Hello world..!!!

4. Javaパッケージ名

Javaでは、a _package_と呼ばれるクラスで同様のクラスをまとめています。
_HelloWorld_クラスを_com.baeldung_パッケージに移動しましょう:
package com.baeldung;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world..!!!");
    }
}
さて、以前のように更新された_HelloWorld_プログラムをコンパイルして実行しましょう:
$ java HelloWorld
Error: Could not find or load main class HelloWorld
ただし、メインクラスHelloWorldが見つからないかロードできませんでした。
ここで見逃したことを理解してみましょう。
*パッケージ内のJavaクラスを実行するには、完全修飾名を指定する必要があります*。 したがって、この場合、_HelloWorldの完全修飾名は_com.baeldung.HelloWorld_です。
_com.baeldung_パッケージを作成したとき、実際には次のようなフォルダー構造を作成しました。
com/baeldung/HelloWorld.java
まず、_com / baeldung_ディレクトリからプログラムを実行してみましょう。
$ java com.baeldung.HelloWorld
Error: Could not find or load main class com.baeldung.HelloWorld
それでも、プログラムを実行することはできません。
ここで、完全修飾クラス名_com.baeldung.HelloWorld_を指定すると、Javaはプログラムを実行したディレクトリの下の_com / baeldung_でHelloWorld.classファイルを見つけようとしました。
すでに_com / baeldung_の中にいたので、Javaは_HelloWorld_プログラムを見つけて実行できませんでした。
それでは、親フォルダに戻って実行してみましょう。
$ java com.baeldung.HelloWorld
Hello world..!!!
はい、私たちは再び世界に「こんにちは」と言うことができます。

5. 無効なクラスパス

先に進む前に、まずクラスパスとは何かを理解しましょう。これは現在実行中のJVMで使用できるクラスのセットです。
クラスパス変数を使用して、ファイルシステム上の_.class_ファイルの場所をJVMに伝えます。
プログラムの実行中に、_- classpath_オプションを使用してクラスパスを提供できます。 例:
java -classpath /my_programs/compiled_classes HelloWorld
ここで、Javaは/ _my_programs / compiled_classes_フォルダー(作成した名前のフォルダー)で_HelloWorld.class_ファイルを探します。 デフォルトでは、*クラスパス変数は現在のディレクトリを意味する「。」に設定されています。*
上記のセクションでは、ディレクトリを変更してプログラムを実行しました。 しかし、他のフォルダーから実行する場合はどうでしょうか? そのとき、クラスパス変数が役立ちます。
ディレクトリ_com / baeldung_からプログラムを実行するには、クラスパスが2つのディレクトリ(パッケージパーツごとに1つ)であると単純に述べることができます。
$ java -claspath ../../ com.baeldung.HelloWorld
Hello world..!!!
ここで、「..」は親ディレクトリを表します。 この場合、「../../」はパッケージ階層の最上位を表します。

6. 結論

このチュートリアルでは、「メインクラスを見つけられないかロードできませんでした」というエラーの考えられる理由を学びました。
そして、もちろん、このエラーを解決する方法も学びました。