「Error: Could not find or load main class」(日本語環境では「エラー: メイン・クラス○○が見つからなかったかロードできませんでした」)は、java コマンドに渡したクラス名の .class ファイルを、クラスパスの中から見つけられなかったときに出るエラーです。 原因はほぼ次の3つのどれかです。

  1. クラス名の書き方が違う(.class を付けた、大文字小文字が違う、パッケージ名を付けていない)
  2. クラスパスの場所が違う(パッケージの一番上のフォルダを指していない、-cp や CLASSPATH でカレントが外れた)
  3. jar の設定が違う(Main-Class が無い・名前が違う・マニフェストの最終行に改行が無い)

どれに当たるかは、エラーの2行目の Caused by: でほぼ見分けられます。この記事では12通りの間違いを実際に起こし、出たメッセージと直し方を並べました。

確認環境:Ubuntu 24.04、OpenJDK 21.0.10(javac・java・jar コマンド)(確認日 2026年10月10日)。日本語の Windows ではメッセージが日本語で表示されますが、Caused by: 以下の内容は同じです。

まず Caused by: で原因を分ける

Caused by: の内容 意味 主な原因
ClassNotFoundException: Hello.class 「Hello.class」というクラスを探した 例1:.class を付けて実行した
ClassNotFoundException: App クラスパスに App.class が無い 例2・3・6・8・9:名前の大文字小文字、パッケージ名なし、クラスパスの場所違い
NoClassDefFoundError: App (wrong name: com/example/App) ファイルは見つかったが、中身のクラス名(パッケージ付き)が違う 例4:パッケージのフォルダの中で実行した
no main manifest attribute, in app.jar(Caused by なし) jar に Main-Class が無い 例10・11:マニフェストの指定漏れ、最終行の改行なし
Main method not found in class ... クラスは読めたが main メソッドが無い 例12:main の書き方
UnsupportedClassVersionError ... class file version 69.0 新しい Java でコンパイルしたクラスを、それより前の版の Java で実行した 「似ているが別のエラー」の章

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Could not find or load main classの原因と直し方」

正しい形(ここから外れると出る)

プロジェクト/
├─ src/com/example/App.java      ← package com.example; と書いてある
└─ out/com/example/App.class     ← javac -d out で出力された
javac -d out src/com/example/App.java   # out の下に com/example/App.class ができる
java -cp out com.example.App            # クラスパス=パッケージの一番上(out)、名前=パッケージ付き
App OK

-cp には「パッケージの一番上のフォルダ(または jar)」を、クラス名には「パッケージ名.クラス名」を渡す。この2つがそろうと、Java は out/com/example/App.class を見つけられます。

原因と直し方:12の例

例1:.class を付けて実行した

$ java Hello.class
Error: Could not find or load main class Hello.class
Caused by: java.lang.ClassNotFoundException: Hello.class

java に渡すのはファイル名ではなくクラス名です。java Hello と、拡張子を付けずに実行します。

例2:クラス名の大文字小文字が違う

$ java hello
Error: Could not find or load main class hello
Caused by: java.lang.ClassNotFoundException: hello

クラス名は大文字小文字を区別します。public class Hello なら java Hello です。Windows や macOS のように大文字小文字を区別しないファイルシステムでは、Hello.class ファイル自体は見つかるため、NoClassDefFoundError: hello (wrong name: Hello) のように「名前が違う」と表示されます。

例3:パッケージ付きのクラスを、クラス名だけで実行した

$ java -cp out App
Error: Could not find or load main class App
Caused by: java.lang.ClassNotFoundException: App

package com.example; と書いたクラスの名前は com.example.App です。java -cp out com.example.App と、パッケージ名から書きます。

例4:パッケージのフォルダの中に入って実行した

$ cd out/com/example
$ java App
Error: Could not find or load main class App
Caused by: java.lang.NoClassDefFoundError: App (wrong name: com/example/App)

App.class は見つかったものの、中身のクラス名が com/example/App なので「名前が違う」と言われています。cd でパッケージの一番上(out)まで戻り、java com.example.App で実行します。

$ cd out
$ java com.example.App
App OK

例5:クラスパスにクラスのあるフォルダそのものを指定した

$ java -cp out/com/example com.example.App
Error: Could not find or load main class com.example.App
Caused by: java.lang.ClassNotFoundException: com.example.App

-cp は「クラスがあるフォルダ」ではなく「パッケージの一番上」を指定します。Java は -cp のフォルダの下に com/example/App.class を探しにいくため、out/com/example/com/example/App.class を探して見つかりません。-cp out にします。

例6:環境変数 CLASSPATH が設定されている

$ CLASSPATH=/tmp/other java Hello
Error: Could not find or load main class Hello
Caused by: java.lang.ClassNotFoundException: Hello

-cp を付けないとき、Java は環境変数 CLASSPATH をクラスパスとして使います。CLASSPATH が設定されていると、カレントディレクトリ(.)が自動では入らなくなります。以前からあるソフトのインストーラーが Windows の環境変数に CLASSPATH を足していることがあります。

確認 Windows macOS・Linux
設定されているか echo %CLASSPATH% echo $CLASSPATH
その場だけ外す set CLASSPATH= unset CLASSPATH
明示して実行 java -cp . Hello java -cp . Hello

例7:-cp の区切り文字が OS と合っていない

$ java -cp 'out;.' Hello        ← Linux で Windows の区切り「;」を使った
Error: Could not find or load main class Hello
Caused by: java.lang.ClassNotFoundException: Hello

$ java -cp out:. Hello          ← Linux・macOS は「:」
Hello
OS 区切り 例
Windows ;(セミコロン) java -cp "out;lib\*" com.example.App
macOS・Linux :(コロン) java -cp "out:lib/*" com.example.App

lib/* のように * を書くと、そのフォルダの jar がすべてクラスパスに入ります(*.jar とは書きません)。シェルに展開されないよう引用符で囲みます。

例8:-cp で jar だけを指定して、カレントが外れた

$ java -cp lib/util.jar Hello
Error: Could not find or load main class Hello
Caused by: java.lang.ClassNotFoundException: Hello

$ java -cp "lib/util.jar:." Hello
Hello

-cp を指定すると、そこに書いたものだけがクラスパスになります。カレントのクラスも使うなら -cp "lib/util.jar:."(Windows は ;)と . を足します。

例9:javac の出力先(-d)と実行時のクラスパスが違う

javac -d out ... でコンパイルしたのに、java -cp classes ... や -cp . で実行すると、例3と同じ ClassNotFoundException になります。javac -d に渡したフォルダを、そのまま java -cp に渡すと覚えておくと迷いません。

ビルド方法 クラスの出力先 実行例
javac -d out out/ java -cp out com.example.App
Maven target/classes/ java -cp target/classes com.example.App
Gradle build/classes/java/main/ java -cp build/classes/java/main com.example.App

例10:jar に Main-Class が無い

$ jar --create --file app.jar -C out .
$ java -jar app.jar
no main manifest attribute, in app.jar

java -jar は、jar の中の META-INF/MANIFEST.MF に書かれた Main-Class を起動します。作り直すか、クラス名を指定して実行します。

# 作るときに Main-Class を指定する
jar --create --file app.jar --main-class com.example.App -C out .
java -jar app.jar                         # App OK

# 作り直さずに実行する
java -cp app.jar com.example.App          # App OK

Main-Class にパッケージ名を書き忘れると(Main-Class: App)、java -jar で Error: Could not find or load main class App になります。

例11:マニフェストの最終行に改行が無い

マニフェストのファイルを手で書いて jar --manifest で渡すとき、最後の行に改行が無いと、その行は読み込まれません。

$ printf 'Main-Class: com.example.App' > manifest.txt      ← 末尾に改行なし
$ jar --create --file app2.jar --manifest manifest.txt -C out .
$ java -jar app2.jar
no main manifest attribute, in app2.jar

$ unzip -p app2.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 21.0.10 (Ubuntu)

jar の中のマニフェストを見ると、Main-Class の行が消えています。末尾に改行を入れれば動きます。

$ printf 'Main-Class: com.example.App\n' > manifest.txt
$ jar --create --file app3.jar --manifest manifest.txt -C out .
$ java -jar app3.jar
App OK

jar ファイルの仕様でも、マニフェストの各行は改行で終わる形式として定められています。--main-class オプションを使えば、この問題は起きません。

例12:main メソッドが無い・書き方が違う

$ java -cp nomain NoMain
Error: Main method not found in class NoMain, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

これはクラス自体は読めたあとのエラーです。Java 21 では public static void main(String[] args) の形が必要です(static が無い、引数が String 1つ、戻り値が int などはこのエラーになります)。

Spring Boot の jar:-cp でクラス名を指定しても起動しない

Spring Boot の実行可能 jar は、アプリのクラスが BOOT-INF/classes/ の下、依存ライブラリが BOOT-INF/lib/ の下に入る独自の構造です。

app.jar
├─ META-INF/MANIFEST.MF        Main-Class: org.springframework.boot.loader.launch.JarLauncher
│                              Start-Class: com.example.DemoApplication
├─ org/springframework/boot/loader/...
└─ BOOT-INF/
   ├─ classes/com/example/DemoApplication.class
   └─ lib/*.jar

そのため java -cp app.jar com.example.DemoApplication では、jar の一番上に com/example/... が無いので見つかりません。java -jar app.jar で起動します(Main-Class のランチャーが Start-Class を起動します)。

mvn package のあと target/ に app.jar と app.jar.original ができ、.original のほうは依存ライブラリを含まない通常の jar です。こちらを java -jar で動かすと、no main manifest attribute などになります。

IDE で出るとき

IDE よくある原因 直し方
Eclipse パッケージ宣言とフォルダが合っていない、ビルドパスから src が外れている、自動ビルドが止まっている 「プロジェクト」→「クリーン」、「ビルド・パスの構成」でソース・フォルダーを確認、「実行構成」のメイン・クラス名をパッケージ付きにする
IntelliJ IDEA 実行構成に変更前のクラス名が残っている(クラス名・パッケージを変えた後)、モジュールの出力先が未設定 実行構成を削除して main の横の ▶ から作り直す、「Build」→「Rebuild Project」
VS Code Java 拡張がプロジェクトを読み込めていない、launch.json の mainClass が変更前のまま コマンドパレットの「Java: Clean Java Language Server Workspace」、mainClass をパッケージ付きにする
共通 ファイル名とクラス名が違う(public class Hello が hello.java に入っている) public クラスはファイル名と同じ名前にする(コンパイルエラーになるので、まず javac の出力を見る)

似ているが別のエラー

UnsupportedClassVersionError:Java の版が合わない

$ java Hello
Error: LinkageError occurred while loading main class Hello
    java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 65.0

(クラスファイルの版の数字を 69 に書き換えて、Java 21 で動かした結果です)

新しい Java でコンパイルしたクラスを、それより前の版の Java で実行すると出ます。java -version と javac -version をそろえるか、前の版で動かす必要があるなら javac --release 17 のように実行先の版を指定してコンパイルします。

class file version Java
52 8
55 11
61 17
65 21
69 25

NoClassDefFoundError:main は見つかったが、使っているクラスが無い

$ java -cp out com.example.Main2
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/util/Greeter
    at com.example.Main2.main(Main2.java:3)
Caused by: java.lang.ClassNotFoundException: com.example.util.Greeter

Error: Could not find or load main class ではなく Exception in thread "main" で始まるのが見分けどころです。main のクラスは起動できていて、その中で使うライブラリがクラスパスに無い状態です。-cp out:lib のように、依存する jar やフォルダを足すと動きます。

$ java -cp out:lib com.example.Main2
hello from lib

1ファイルなら javac なしで実行できる

Java 11 以降は、1つのソースファイルを javac なしで直接実行できます。クラスパスやパッケージのフォルダで迷わずに、まず動くかを確かめるのに便利です。

$ java src/com/example/App.java
App OK

確認の手順(チェックリスト)

順番 確認すること コマンド例
1 .class ファイルがどこにできたか find out -name "*.class"(Windows は dir /s /b out\*.class)
2 ソースの1行目の package head -1 src/com/example/App.java
3 実行するクラス名=パッケージ名+クラス名 com.example.App
4 -cp =パッケージの一番上のフォルダ out
5 CLASSPATH が設定されていないか echo $CLASSPATH
6 jar なら Main-Class を確認 unzip -p app.jar META-INF/MANIFEST.MF
7 java と javac の版が同じか java -version、javac -version

よくある質問

Q. 昨日まで動いていたのに、急に出るようになりました。 A. パッケージ名やクラス名を変えた、ビルドの出力先が変わった、CLASSPATH を設定するソフトを入れた、のどれかが多い原因です。IDE なら実行構成に変更前のクラス名が残っていることもあります。

Q. 日本語のメッセージ「メイン・クラス○○が見つからなかったかロードできませんでした」も同じですか。 A. 同じエラーです。表示が日本語になっているだけで、原因と直し方はこの記事のとおりです。続く「原因: java.lang.ClassNotFoundException」が Caused by: に当たります。

Q. ClassNotFoundException と NoClassDefFoundError の違いは何ですか。 A. 起動時のメッセージでは、ClassNotFoundException は「その名前のファイルが見つからない」、NoClassDefFoundError ... (wrong name: ...) は「ファイルはあるがクラス名が違う」です。起動後に出る NoClassDefFoundError は、コンパイル時にはあったクラスが実行時に無い状態です。

Q. ダブルクリックで jar を起動すると何も起きません。 A. コマンドプロンプトで java -jar app.jar を実行すると、エラーの内容が表示されます。no main manifest attribute なら例10・11、UnsupportedClassVersionError なら Java の版が原因です。

まとめ

  • Caused by: を読むと原因が分かる:ClassNotFoundException は名前か場所、wrong name はパッケージ、no main manifest attribute は jar の設定
  • java に渡すのは「パッケージ名.クラス名」。.class は付けない、大文字小文字を合わせる
  • -cp は「パッケージの一番上」。javac -d の出力先をそのまま渡す。区切りは Windows が ;、macOS・Linux が :
  • 環境変数 CLASSPATH があるとカレントが外れる
  • jar は --main-class で作る。手書きのマニフェストは最終行に改行が無いと読み込まれない
  • Spring Boot の jar は java -jar で起動し、.original は使わない

参考・出典

確認日はいずれも 2026年10月10日です。

  • Java SE 21「The java Command」:https://docs.oracle.com/en/java/javase/21/docs/specs/man/java.html
  • Java SE 21「The javac Command」:https://docs.oracle.com/en/java/javase/21/docs/specs/man/javac.html
  • Java SE 21「The jar Command」:https://docs.oracle.com/en/java/javase/21/docs/specs/man/jar.html
  • Java SE 21「JAR File Specification」:https://docs.oracle.com/en/java/javase/21/docs/specs/jar/jar.html
  • Java Virtual Machine Specification(Java SE 21)「The class File Format」:https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-4.html
  • JEP 330「Launch Single-File Source-Code Programs」:https://openjdk.org/jeps/330
  • Spring Boot リファレンス「The Executable Jar Format」:https://docs.spring.io/spring-boot/specification/executable-jar/index.html
  • Baeldung「Could Not Find or Load Main Class Error」:https://www.baeldung.com/java-could-not-find-load-main-class

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Could not find or load main classの原因と直し方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?