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では、パッケージと呼ばれるものに同様のクラスをまとめています。

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で使用できるクラスのセットです。

classpath変数を使用して、ファイルシステム上の.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. 結論

この記事では、「メインクラスが見つからないかロードできませんでした」というエラーの考えられる理由を学びました。

その後、もちろん、このエラーを解決する方法も学びました。