MeWrite Docs

Error: Could not find or load main class

Javaでメインクラスが見つからない場合のエラー

概要

Error: Could not find or load main class は、Javaプログラムを実行しようとした際に、指定したメインクラスが見つからない場合に発生するエラーです。

エラーメッセージ

Error: Could not find or load main class com.example.Main
Caused by: java.lang.ClassNotFoundException: com.example.Main
Error: Could not find or load main class Main

原因

1. クラスパスが設定されていない

1
2
3
4
5
# NG: クラスパスなしで実行
java Main

# クラスファイルの場所:
# ./out/Main.class

2. パッケージ名とディレクトリ構造の不一致

1
2
3
4
5
6
7
8
// Main.java
package com.example;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}
1
2
3
4
# NG: パッケージ構造を無視して実行
java Main

# クラスファイルは com/example/Main.class にある必要がある

3. .classではなく.javaを指定

1
2
3
4
5
# NG: 拡張子を含めている
java Main.class

# OK: 拡張子なし
java Main

4. FQCNでなくクラス名のみ指定

1
2
3
4
5
# NG: パッケージを含めていない
java Main

# OK: 完全修飾クラス名
java com.example.Main

解決策

1. クラスパスを正しく指定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 現在のディレクトリをクラスパスに指定
java -cp . Main

# 特定のディレクトリを指定
java -cp ./out com.example.Main

# 複数のパスを指定(Linux/Mac)
java -cp "./lib/*:./out" com.example.Main

# 複数のパスを指定(Windows)
java -cp "./lib/*;./out" com.example.Main

2. 正しいディレクトリ構造を作成

project/
├── src/
│   └── com/
│       └── example/
│           └── Main.java
└── out/
    └── com/
        └── example/
            └── Main.class
1
2
3
4
5
# コンパイル
javac -d out src/com/example/Main.java

# 実行
java -cp out com.example.Main

3. パッケージなしの場合

1
2
3
4
5
6
// Main.java(パッケージなし)
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}
1
2
3
4
5
# コンパイル
javac Main.java

# 実行
java Main

4. JARファイルの実行

1
2
3
4
5
# マニフェストにMain-Classが指定されている場合
java -jar myapp.jar

# クラスパスにJARを含める場合
java -cp "myapp.jar:lib/*" com.example.Main

よくあるパターン

IDEからコマンドラインへ移行時

1
2
3
4
5
# IDEでビルドした出力ディレクトリを確認
ls -la out/production/myproject/

# そこをクラスパスに指定
java -cp out/production/myproject com.example.Main

Maven/Gradleプロジェクト

1
2
3
4
5
6
7
# Maven
mvn compile
java -cp target/classes com.example.Main

# Gradle
./gradlew build
java -cp build/classes/java/main com.example.Main

依存ライブラリがある場合

1
2
3
4
5
# すべてのJARを含める
java -cp "target/classes:target/dependency/*" com.example.Main

# Mavenで依存関係をコピー
mvn dependency:copy-dependencies

デバッグ方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# クラスファイルの場所を確認
find . -name "*.class"

# クラスファイルの内容を確認
javap -v com/example/Main.class | head -20

# クラスパスを確認
echo $CLASSPATH

# 詳細なエラー情報
java -verbose:class -cp . com.example.Main 2>&1 | head -50

よくある間違い

拡張子の問題

1
2
3
4
5
6
7
8
# NG: .classを含める
java Main.class

# NG: .javaを含める
java Main.java

# OK
java Main

ディレクトリからの実行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# NG: クラスファイルのあるディレクトリで実行するだけでは不十分
cd out/com/example
java Main

# OK: クラスパスを指定
cd out
java com.example.Main

# または
java -cp out com.example.Main

環境変数CLASSPATH

1
2
3
4
5
6
7
8
# 環境変数を設定(一時的)
export CLASSPATH=./out

# 実行
java com.example.Main

# または、常にコマンドラインで指定する方が明確
java -cp ./out com.example.Main

関連エラー

関連エラー

Java の他のエラー

最終更新: 2025-12-24