Javaでプログラムを開発・実行する際、多くのエンジニアが一度は遭遇するのが「Error: Could not find or load main class」というエラーです。
このエラーは、Java仮想マシン (JVM) が実行対象となるクラスファイルを特定できなかった、あるいは読み込めなかったことを示しています。
コード自体に文法的な誤りがなくても発生するため、特に初心者にとっては原因の特定が難しく、開発の手が止まってしまう要因になりがちです。
本記事では、このエラーが発生する根本的なメカニズムから、パッケージ構造、クラスパスの設定、JARファイル作成時の注意点まで、Java実行エラーを解消するための具体的な手順を網羅的に解説します。
プロフェッショナルな現場でも通用するトラブルシューティングのスキルを身につけ、スムーズな開発を実現しましょう。
Error: Could not find or load main class とは
このエラーは、文字通り「メインクラスを見つけることができない、あるいはロードできない」という状態を指します。
Javaプログラムを実行するコマンドである java コマンドを実行した際、JVMは引数で指定されたクラス名を探し、その中にある public static void main(String[] args) メソッドを呼び出そうとします。
しかし、指定された場所にクラスファイルが存在しない場合や、指定した名前に誤りがある場合、このエラーが出力されます。
Java 9以降では、モジュールシステムの影響でエラーメッセージが詳細化されていることもありますが、根本的な原因は「JVMが期待した場所にクラスが存在しない」という点に集約されます。
JVMがクラスを探索する仕組み
JVMは、以下の優先順位や設定に基づいてクラスファイルを探索します。
- クラスパス (-cp または -classpath):指定されたディレクトリやJARファイル内を探します。
- モジュールパス (–module-path):Java 9以降で導入されたモジュール構造に基づいて探します。
- 環境変数 (CLASSPATH):OSレベルで設定されたパスを確認します。
これらの設定のいずれかに不備があると、今回のエラーが発生します。
主な原因1:クラス名の指定ミス
最も基本的でありながら意外に見落としがちなのが、java コマンドに渡す引数の間違いです。
拡張子「.class」を付けてしまっている
初心者が最も陥りやすいミスは、実行時にファイル名として .class や .java を含めてしまうことです。
誤った実行例:
java HelloWorld.class
正しい実行例:
java HelloWorld
java コマンドは「ファイル名」ではなく「クラス名」を受け取ります。
そのため、拡張子は不要です。
大文字・小文字の区別
Javaは大文字と小文字を厳密に区別します。
Windows OSなどファイルシステムがケースインセンシティブな環境であっても、Javaのクラス名指定においては区別が必要です。
- クラス名が
MainAppの場合、java mainappではエラーになります。必ず正確な名称で入力してください。
主な原因2:パッケージ構造の不一致
Javaの実務開発において、最も多い原因がこの「パッケージ宣言とディレクトリ構造の不一致」です。
完全修飾名 (FQCN) での指定
クラスが package com.example; のように宣言されている場合、そのクラスの正式名称は com.example.Main となります。
これを完全修飾名 (Fully Qualified Class Name)と呼びます。
例えば、以下のようなソースコードがあるとします。
// ファイルパス: src/com/example/Main.java
package com.example;
public class Main {
public static void main(String[] args) {
System.out.println("Hello, Package!");
}
}
このプログラムをコンパイルし、実行する場合の正しい手順は以下の通りです。
# 1. ソースのディレクトリへ移動
cd src
# 2. コンパイル
javac com/example/Main.java
# 3. 実行 (パッケージ名を含めて指定)
java com.example.Main
よくある間違い:
com/example ディレクトリまで移動してから java Main を実行すると、JVMは「パッケージなしのMain」を探そうとしますが、実際のクラスファイル内にはパッケージ宣言があるため、不一致が発生しエラーとなります。
主な原因3:クラスパス (Classpath) の設定不備
JVMに「どこを探すべきか」を教えるのがクラスパスです。
デフォルトではカレントディレクトリ . が対象となりますが、外部ライブラリを使用している場合や、特定のディレクトリにビルド成果物を置いている場合は明示的な指定が必要です。
-cp オプションの使用
プロジェクトのルートディレクトリ以外から実行する場合、-cp (または -classpath) オプションでクラスファイルの場所を教える必要があります。
# binディレクトリにクラスファイルがある場合
java -cp bin com.example.Main
複数のパスを指定する場合
複数のディレクトリやJARファイルを指定する場合、OSによって区切り文字が異なる点に注意してください。
- Windows: セミコロン
;を使用 - Linux / macOS: コロン
:を使用
注意点:
環境変数 CLASSPATH を設定していると、それが優先されたり、予期せぬ動作を招いたりすることがあります。
現代のJava開発では、環境変数は使用せず、実行コマンドのオプションで指定するのがベストプラクティスです。
主な原因4:JARファイルの構成ミス
実行可能なJARファイルを作成した際にこのエラーが出る場合、マニフェストファイル (MANIFEST.MF)の設定に問題があります。
Main-Class 属性の不足
JARファイルを java -jar app.jar で実行するためには、JAR内部の META-INF/MANIFEST.MF にどのクラスがメインかを記述しなければなりません。
Manifest-Version: 1.0
Main-Class: com.example.Main
この記述がない、あるいはクラス名が間違っていると、「Could not find or load main class」が発生します。
JARファイルの中身を確認するコマンド
JARファイルが正しく構成されているか確認するには、以下のコマンドを使用します。
jar tf app.jar
このコマンドで、ディレクトリ構造がパッケージ名と一致しているか (例: com/example/Main.class が存在するか) を確認してください。
具体的な解決手順:ケース別トラブルシューティング
ここでは、よくある失敗例とその修正コードを具体的に示します。
ケース1:カレントディレクトリの取り違え
失敗する状況
プロジェクト構成:
/project
/out
MyClass.class
/project にいる状態で java MyClass を実行。
修正方法
出力先ディレクトリを指定するか、そのディレクトリに移動します。
# 修正案A: パスを指定する
java -cp out MyClass
# 修正案B: 移動して実行する
cd out
java MyClass
ケース2:パッケージ宣言がある場合
// HelloWorld.java
package jp.tech.sample;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Java Execution Success");
}
}
実行手順のミス
javac HelloWorld.java
java HelloWorld
# 結果: Error: Could not find or load main class HelloWorld
正しい手順
パッケージ名は「ディレクトリ階層」として物理的に存在しなければなりません。
# 1. パッケージ構造に従ってディレクトリを作成
mkdir -p jp/tech/sample
# 2. ソースを移動、または適切な場所でコンパイル
javac -d . HelloWorld.java
# 3. 実行 (FQCNを使用)
java jp.tech.sample.HelloWorld
Java Execution Success
IDE (IntelliJ IDEA / Eclipse) で発生する場合
コマンドラインではなく、IDE上でこのエラーが発生することもあります。
これはIDEの管理情報と実際のファイル状態が乖離している場合に起こります。
推奨される対処法
- プロジェクトのリビルド
Build>Rebuild Projectを実行します。- キャッシュのクリア
IntelliJ IDEAの場合、
File>Invalidate Caches...を実行して再起動します。- 出力ディレクトリの確認
Project Structure設定で、コンパイル後のクラスファイルが出力されるパス (out または target) が正しく設定されているか確認します。
Java 9以降のモジュールシステムによる影響
Java 9以降では、「モジュールシステム (Project Jigsaw)」が導入されました。
モジュール化されたプロジェクトでは、単なるクラスパスではなく --module-path (または -p) と --module (または -m) オプションを使用します。
# モジュール実行の例
java --module-path mods --module com.example.module/com.example.Main
もし module-info.java を定義しているプロジェクトで従来のような実行方法を試みると、クラスが見つからないエラーが発生することがあります。
自身のプロジェクトがモジュール化されているかどうかを確認してください。
原因特定のためのチェックリスト
エラーが解消しない場合は、以下の表を参考に一つずつ確認してください。
| 確認項目 | 内容 | 解決策 |
|---|---|---|
| クラス名のスペル | 大文字小文字を含め正確か? | java の後の名称を確認 |
| 拡張子の有無 | .class を付けていないか? | 拡張子を削除して実行 |
| パッケージ名 | 完全修飾名 (FQCN) を使っているか? | java com.pkg.Main の形式にする |
| カレントディレクトリ | パッケージの「ルート」にいるか? | com フォルダがある階層へ移動 |
| コンパイル成否 | そもそも .class は存在するか? | ls や dir で確認 |
| クラスパス | 外部ライブラリのパスは通っているか? | -cp オプションを再確認 |
| mainメソッド | シグネチャは正しいか? | public static void main(String[] args) か確認 |
まとめ
「Error: Could not find or load main class」は、Javaエンジニアが必ず通る道と言っても過言ではありません。
このエラーの多くは、「Javaの命名規則(パッケージとディレクトリの関係)」および「クラスパスの概念」への理解不足から生じます。
解決の鍵は、焦ってコードを書き直すのではなく、「今、自分はどのディレクトリにいて、JVMはどこを見ているのか」を客観的に把握することです。
- 実行時に拡張子を付けない
- パッケージ名を含めた完全修飾名で指定する
- 正しいディレクトリ階層からコマンドを叩く
これらの基本を徹底するだけで、エラーの大部分は解消されます。
本記事で解説したトラブルシューティングを活用し、Java開発の効率をさらに高めていきましょう。






