Java で'Could Not Find or Load Main Class'エラーを解決する

JavaBeginner
オンラインで実践に進む

はじめに

Java プログラミングを学ぶ際、様々なエラーや例外に遭遇することは避けられません。多くの初心者が直面する一般的なエラーの一つに、「Could Not Find or Load Main Class」エラーがあります。このエラーは、Java 仮想マシン(JVM)が、アプリケーションのエントリーポイントとなる main メソッドを含むクラスを見つけたり、ロードしたりできない場合に発生します。

この実験(Lab)では、このエラーの一般的な原因を探求し、それを解決するための様々なアプローチを学びます。このエラーの根本的な原因を理解することで、今後の Java プログラミングの取り組みにおいて、同様の問題をより良く処理できるようになるでしょう。

シンプルな Java プログラムの作成

このステップでは、Java のコンパイルと実行の基本を理解するために、簡単な Java プログラムを作成します。

  1. まず、新しい Java ファイルを作成しましょう。WebIDE で、プロジェクトディレクトリ(~/project)に移動し、HelloWorld.javaという名前の新しいファイルを作成します。

  2. HelloWorld.javaファイルに以下のコードを追加します。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java World!");
    }
}

このコードが何をするのか理解しましょう。

  • public class HelloWorld: HelloWorld という名前の public クラスを定義します。
  • public static void main(String[] args): Java アプリケーションのエントリーポイントである main メソッドを定義します。
  • System.out.println("Hello, Java World!"): コンソールに「Hello, Java World!」というテキストを出力します。

最も重要な点は、クラス名(HelloWorld)がファイル名(HelloWorld.java)と一致していることです。この命名規則は Java において非常に重要であり、これに従わないことが、「Could Not Find or Load Main Class」エラーの一般的な原因の一つです。

  1. Ctrl+S を押すか、メニューから「File > Save」を選択してファイルを保存します。

Java プログラムのコンパイルと実行

Java プログラムを作成したので、次はそれをコンパイルして実行する必要があります。Java におけるコンパイルは、人間が読めるコード(ソースコード)を、Java 仮想マシン(JVM)が理解できるバイトコードに変換します。

  1. メニューから「Terminal > New Terminal」をクリックして、WebIDE でターミナルを開きます(まだ開いていない場合)。

  2. 正しいディレクトリにいることを確認します。

cd ~/project
  1. javacコマンドを使用して Java プログラムをコンパイルします。
javac HelloWorld.java

何も出力が表示されない場合、コンパイルは成功したことを意味します。コンパイルプロセスは、同じディレクトリにHelloWorld.classという名前のファイルを作成します。この.classファイルには、JVM が実行できるバイトコードが含まれています。

このファイルの作成を確認するには、ディレクトリの内容を一覧表示します。

ls

出力には、HelloWorld.javaHelloWorld.classの両方のファイルが表示されるはずです。

HelloWorld.class  HelloWorld.java
  1. javaコマンドを使用して、コンパイルされたプログラムを実行します。
java HelloWorld

以下の出力が表示されるはずです。

Hello, Java World!

これは、プログラムが正常にコンパイルされ、実行されたことを示しています。

次のステップで「Could Not Find or Load Main Class」エラーを探求する前に、この基本的なワークフローを理解することが不可欠です。

"Could Not Find or Load Main Class"エラーの理解

Java プログラムのコンパイルと実行の基本を理解したので、次は「Could Not Find or Load Main Class」エラーとその一般的な原因を探求しましょう。

エラーシナリオ 1:クラス名の不一致

このエラーの最も一般的な原因の 1 つは、コード内のクラス名とファイル名との不一致です。

  1. 以下の内容で、NameMismatch.javaという名前の新しいファイルを作成します。
public class IncorrectName {
    public static void main(String[] args) {
        System.out.println("This program will cause an error!");
    }
}

クラス名(IncorrectName)がファイル名(NameMismatch.java)と一致しないことに注意してください。

  1. このファイルをコンパイルしてみましょう。
javac NameMismatch.java

コンパイルは成功するはずですが、IncorrectName.classという名前のファイルが作成されます(ファイル名ではなく、クラス名と一致します)。

  1. 次に、ファイル名を使用してプログラムを実行してみましょう。
java NameMismatch

エラーが表示されます。

Error: Could not find or load main class NameMismatch
Caused by: java.lang.ClassNotFoundException: NameMismatch
  1. このエラーを修正するには、正しいクラス名を使用してプログラムを実行する必要があります。
java IncorrectName

これで、出力が表示されるはずです。

This program will cause an error!

エラーシナリオ 2:誤ったディレクトリからの実行

もう 1 つの一般的な原因は、コンパイルされた.classファイルが含まれていないディレクトリから Java クラスを実行しようとすることです。

  1. このデモンストレーションのために、サブディレクトリを作成します。
mkdir subdirectory
  1. この新しいディレクトリに移動します。
cd subdirectory
  1. このディレクトリから HelloWorld プログラムを実行してみましょう。
java HelloWorld

エラーが表示されます。

Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
  1. このエラーを修正するには、次のいずれかの方法を行います。

    • .classファイルが含まれているディレクトリに戻ります。
    cd ..
    java HelloWorld
    • または、クラスファイルへのフルパスを指定します(これはステップ 5 で説明します)。

次のステップに進むために、プロジェクトディレクトリに戻ります。

cd ~/project

Java パッケージの利用

Java のパッケージは、クラスを名前空間に整理するために使用されます。名前の競合を防ぎ、アクセス制御を提供することで、大規模なアプリケーションの管理に役立ちます。ただし、パッケージを誤って使用すると、「Could Not Find or Load Main Class」エラーが発生することもあります。

パッケージ構造の理解

  1. まず、パッケージのディレクトリ構造を作成しましょう。Java では、パッケージ構造はディレクトリ構造と一致する必要があります。
mkdir -p ~/project/com/example
  1. com/exampleディレクトリ内に、PackagedClass.javaという名前の新しい Java ファイルを作成します。
cd ~/project/com/example
  1. PackagedClass.javaに以下のコードを追加します。
package com.example;

public class PackagedClass {
    public static void main(String[] args) {
        System.out.println("This class is in a package!");
    }
}

ファイルの先頭にあるpackage com.example;宣言に注目してください。これは、このクラスがcom.exampleパッケージに属していることを Java に伝えます。

  1. プロジェクトディレクトリに戻り、ファイルをコンパイルします。
cd ~/project
javac com/example/PackagedClass.java
  1. クラス名のみを使用してクラスを実行しようとすると、エラーが発生します。
java PackagedClass

出力:

Error: Could not find or load main class PackagedClass
Caused by: java.lang.ClassNotFoundException: PackagedClass
  1. パッケージ内のクラスを実行する正しい方法は、完全修飾クラス名(パッケージを含む)を使用することです。
java com.example.PackagedClass

これで、出力が表示されるはずです。

This class is in a package!

パッケージに関する重要なポイント

  • パッケージ宣言は、ファイルの最初のステートメントでなければなりません。
  • ディレクトリ構造は、パッケージ構造と一致する必要があります。
  • パッケージ化されたクラスを実行する場合は、完全修飾クラス名を使用する必要があります。
  • コンパイルコマンドには、ソースファイルへのパスを含める必要がありますが、実行コマンドでは、ファイルパスではなく、パッケージ名とクラス名を使用する必要があります。

このパッケージシステムは、Java 開発、特に大規模なアプリケーションにとって不可欠です。

クラスパスを使用したクラスローディング問題の解決

クラスパスは、Java 仮想マシンにクラスとパッケージの検索場所を指示するパラメータです。特に複雑なプロジェクトでは、「Could Not Find or Load Main Class」エラーを解決するために、クラスパスの使用方法を理解することが不可欠です。

クラスパスとは?

クラスパスは、クラスファイルを含むディレクトリ、JAR ファイル、および ZIP ファイルのリストです。JVM は、プログラムの読み込みと実行時に、このリストを使用してクラスを検索します。

クラスパスパラメータの使用

クラスパスの使用方法を説明するために、新しいディレクトリ構造を作成しましょう。

  1. コンパイルされたクラス用の新しいディレクトリを作成します。
mkdir -p ~/project/classes
  1. プロジェクトディレクトリに、ClasspathDemo.javaという名前の新しい Java ファイルを作成します。
public class ClasspathDemo {
    public static void main(String[] args) {
        System.out.println("Successfully loaded class using classpath!");
    }
}
  1. Java ファイルをコンパイルしますが、.classファイルをclassesディレクトリに配置するように指定します。
javac -d classes ClasspathDemo.java

-dオプションは、コンパイルされたクラスファイルの宛先ディレクトリを指定します。クラスファイルが指定されたディレクトリに作成されたことを確認できます。

ls classes

以下が表示されるはずです。

ClasspathDemo.class
  1. 次に、クラスパスを指定せずにプログラムを実行してみましょう。
java ClasspathDemo

エラーが表示されます。

Error: Could not find or load main class ClasspathDemo
Caused by: java.lang.ClassNotFoundException: ClasspathDemo
  1. このエラーを修正するには、プログラムを実行するときにクラスパスを指定する必要があります。
java -classpath classes ClasspathDemo

または、より短い-cpオプションを使用できます。

java -cp classes ClasspathDemo

これで、出力が表示されるはずです。

Successfully loaded class using classpath!

クラスパス環境変数の設定

Java プログラムを実行するたびにクラスパスを指定する代わりに、CLASSPATH環境変数を設定できます。

export CLASSPATH=~/project/classes:$CLASSPATH

この環境変数を設定した後、-classpathオプションなしでプログラムを実行できます。

java ClasspathDemo

そして、同じ出力が表示されるはずです。

Successfully loaded class using classpath!

クラスパスを使用するタイミング

以下の場合にクラスパスを使用する必要があります。

  • クラスが現在のディレクトリにない場合
  • サードパーティライブラリ(JAR ファイル)を使用している場合
  • 複数のソースディレクトリを持つ複雑なプロジェクト構造がある場合
  • Maven や Gradle などのビルドツールを使用している場合(これらはクラスパスを管理します)

クラスパスを理解することは、単純な単一ファイルプログラムを超えた Java 開発にとって重要であり、より複雑な設定での「Could Not Find or Load Main Class」エラーの解決策となることがよくあります。

まとめ

この実験を通して、Java でよくある「Could Not Find or Load Main Class」エラーについて探求し、それを解決するためのいくつかの方法を学びました。以下は、私たちがカバーした内容のまとめです。

  1. 基本的な Java のコンパイルと実行: javacおよびjavaコマンドを使用して、シンプルな Java プログラムを作成、コンパイル、および実行する方法を学びました。

  2. 一般的なエラーの原因:

    • コードとファイル名間のクラス名の不一致
    • 間違ったディレクトリからの実行
    • 不適切なパッケージの使用
    • クラスパスの問題
  3. パッケージの操作: パッケージ構造とディレクトリ構造の関係、およびパッケージ化されたクラスを正しく実行する方法など、Java でのパッケージの仕組みを探求しました。

  4. クラスパスの使用: 特に複雑なプロジェクトで役立つ、JVM にクラスの検索場所を指示するためのクラスパスオプションの使用方法を学びました。

「Could Not Find or Load Main Class」エラーは、最初はイライラするかもしれませんが、その原因を理解することで、診断と修正がはるかに簡単になります。これらの重要なポイントを覚えておいてください。

  • コード内のクラス名は、ファイル名(.java拡張子なし)と一致する必要があります。
  • パッケージを使用する場合、ディレクトリ構造はパッケージ構造と一致する必要があります。
  • 常に正しいディレクトリから Java プログラムを実行するか、クラスパスを使用してクラスの場所を指定してください。
  • パッケージ化されたクラスの場合、プログラムを実行するときは、完全修飾クラス名(パッケージを含む)を使用します。

これらの概念を習得することで、Java 開発の過程でこの一般的なエラーを回避したり、迅速に解決したりできるようになります。