【2026年9月最新】Javaのjarファイル作成・解凍・実行を完全ガイド|jarコマンドとMain-Classの正しい書き方
「Javaのjarファイルを作りたいが、コマンドが複雑でよく分からない」「作ったjarファイルを実行しようとしたらエラーが出た」——この記事にたどり着いた方は、Javaのパッケージング(配布用ファイルの作成)でつまずいているはずです。
結論から言うと、実行可能なjarファイルを作るにはjar cfe app.jar Main *.class(パッケージを使う場合はディレクトリごと指定)、実行するにはjava -jar app.jarが基本形です。ただし、マニフェストファイルの書き方やclasspathの指定方法にはOSごとの違いもあり、初心者が必ずどこかでつまずくポイントがあります。
この記事では、jarファイルの基本構造から、作成・実行・解凍のコマンド、よくあるエラーの原因まで、コード例つきで整理します。あわせて、弊社(株式会社GENAI)がClaude Codeを全社で運用している立場から、「ビルド・パッケージングの細かいミスを、非エンジニアの経営者がどう管理するか」という視点も加えて解説します。
この記事を最後まで読むと、次の6つが明確になります。
01 BASICS jarファイルとは何か|基本構造を理解する 非エンジニアにも分かる例え話で理解する
jarファイル(Java ARchive)は、Javaプログラムを構成する複数のファイル(クラスファイルやリソース)を1つにまとめて配布・実行できる形式にしたパッケージです。「複数の書類をまとめて1つの封筒に入れて渡す」というイメージだと理解しやすくなります。
📚 用語解説
jarファイル (Java ARchive):複数のJavaクラスファイルやリソースファイルを1つにまとめた圧縮ファイル形式。拡張子は.jar。内部的にはZIP形式と同じ圧縮方式が使われており、実態としては「Java用に規格化されたZIPファイル」と言えます。
jarファイルの中には、通常のクラスファイルに加えてMETA-INF/MANIFEST.MFという特別なファイルが含まれます。これは「この箱(jarファイル)の中身を、どう扱えばいいか」を記した説明書のような役割を持っています。
📚 用語解説
マニフェストファイル (MANIFEST.MF):jarファイルの中に自動的に含まれる設定ファイル。「どのクラスを最初に実行すればいいか(Main-Class)」といった、Javaの実行環境に対する指示情報が記述されます。手動で編集する場合はテキストファイルとして作成し、jar作成時に組み込みます。
jarファイルは大きく分けて、「ライブラリとして他のプログラムから読み込まれるjar」と「単体で実行できる実行可能jar」の2種類に分けられます。この記事では主に、実行可能jarの作成・実行に焦点を当てて解説します。
1-1. jar・war・earの違い
Javaのアーカイブ形式には、jar以外にも用途別の拡張版が存在します。名前が似ているため混同されがちですが、それぞれ用途が異なります。
| 拡張子 | 正式名称 | 主な用途 |
|---|---|---|
| .jar | Java ARchive | 汎用のクラスファイル・リソースのパッケージ。単体実行も可能 |
| .war | Web application ARchive | Webアプリケーション用。Tomcat等のサーブレットコンテナにデプロイして使う |
| .ear | Enterprise ARchive | 複数のwar・jarをまとめた、エンタープライズアプリケーション向けの形式 |
いずれも内部的にはZIP形式をベースにしており、「何のためにパッケージ化するか」によって呼び方と内部構造の規約が変わると理解しておくと整理しやすくなります。個人開発や小規模ツールであれば、基本的にjarファイルだけを扱うケースがほとんどです。
02 COMMAND BASICS jarコマンドの基本オプション一覧 作成・一覧・解凍・更新、代表的な4つの操作
jarファイルの操作は、JDK(Java Development Kit)に標準で付属するjarコマンドで行います。基本構文は以下の通りです。
jar [操作オプション] jarファイル名 [対象ファイル...]
代表的な操作オプションを一覧で整理します。
| オプション | 意味 | 主な用途 |
|---|---|---|
| c | create(新規作成) | 新しいjarファイルを作成する |
| t | table(一覧表示) | jarファイルの中身の一覧を確認する |
| x | extract(展開) | jarファイルの中身を取り出す |
| u | update(更新) | 既存のjarファイルにファイルを追加・更新する |
| f | file(ファイル名指定) | 操作対象のjarファイル名を指定する(ほぼ必須) |
| m | manifest(マニフェスト指定) | 独自に用意したマニフェストファイルを組み込む |
| e | entrypoint(エントリポイント指定) | Main-Classをコマンドから直接指定する |
| v | verbose(詳細表示) | 処理内容を詳しく画面に表示する |
jarコマンドのオプションは、cfやtvfのように複数を連結して1つの引数として渡すのが伝統的な書き方です。c(作成)とf(ファイル名指定)を組み合わせたcfが最も基本的な組み合わせになります。
03 CREATING JAR jarファイルの作成方法【実行可能jarまで】 コンパイルからMain-Classの指定まで段階的に解説
jarファイルを作成するには、まずJavaのソースコードをコンパイルしてクラスファイルを用意します。
javac Main.java
# Main.class が生成される
📚 用語解説
コンパイル:人間が書いたソースコード(.javaファイル)を、コンピュータが実行できる形式(.classファイル)に変換する処理。Javaではjavacコマンドがコンパイラの役割を担い、変換後のクラスファイルを実行するのはjavaコマンド(JVM)という役割分担になっています。
3-1. 通常のjarファイルを作成する
コンパイル済みのクラスファイルをまとめてjar化する、最もシンプルな例です。
jar cf app.jar Main.class
# app.jar というjarファイルが作成される
3-2. 実行可能jarファイルを作成する(Main-Classを指定)
単にjar cfで作っただけのjarファイルは、まだ「どのクラスから実行を始めるか」の情報を持っていません。実行可能jarにするには、Main-Classをマニフェストに記述する必要があります。もっとも簡単な方法は、-eオプションでエントリポイント(開始点となるクラス)を直接指定することです。パッケージを使っていない場合は、以下のようにシンプルに書けます。
jar cfe app.jar Main *.class
# c: 作成 / f: ファイル名指定 / e: エントリポイント指定
パッケージ(com.exampleのような名前空間)を使っている場合は注意が必要です。com.example.MainというFQCN(完全修飾クラス名)を指定するなら、コンパイル時に-dオプションでパッケージ名に対応したディレクトリ構造(com/example/Main.class)を生成し、jar作成時もそのディレクトリごと対象に含める必要があります。
javac -d . com/example/Main.java
# com/example/Main.class が生成される
jar cfe app.jar com.example.Main com/example/*.class
# パッケージのディレクトリ構造ごとjar化する
カレントディレクトリ直下の*.classという指定は、サブディレクトリの中身までは対象になりません。パッケージ構成のプロジェクトでは、com/example/*.classのようにパッケージのディレクトリを明示するか、ディレクトリごと指定してjar化する必要があります。指定が漏れると、Main-Classに指定したクラスがjarの中に含まれず、実行時にクラスが見つからないエラーになります。
3-3. 独自のマニフェストファイルを使う方法
より細かい設定(Class-Path指定など)を行いたい場合は、マニフェストファイルを自分で用意して-mオプションで組み込みます。
# manifest.txt の中身
Main-Class: Main
# jarを作成
jar cfm app.jar manifest.txt *.class
# パッケージを使う場合は、Main-Classをパッケージ込みのFQCNにし、
# 対象ファイルもパッケージのディレクトリごと指定する
# 例: Main-Class: com.example.Main
# jar cfm app.jar manifest.txt com/example/*.class
手動でマニフェストファイル(manifest.txt)を作成する場合、最終行の末尾に改行を入れておかないと、記述した内容が正しく認識されないことがあります。テキストエディタによっては最終行に改行が入らない設定になっていることがあるため、保存後に確認しておくと安心です。
📚 用語解説
FQCN (完全修飾クラス名):パッケージ名を含めた、クラスの完全な名前。例えばcom.exampleパッケージのMainクラスであればcom.example.Mainと表記します。Main-Classの指定など、jarに関する設定では必ずこの完全な形式で指定する必要があります。
-eオプションでのエントリポイント指定は、マニフェストファイルを別途用意する手間を省ける便利な方法です。まずはこちらで実行可能jarを作れるようになってから、必要に応じて独自マニフェストに進むのがおすすめです。3-4. 既存のjarファイルを更新する
一度作成したjarファイルに、新しいクラスファイルを追加したり、既存のファイルを更新したりしたい場合は、作り直す必要はありません。u(update)オプションを使えば、既存のjarファイルの中身を差分更新できます。
jar uf app.jar NewClass.class
# app.jar に NewClass.class を追加・更新する
大量のファイルを含む大きなjarファイルを扱う場合、毎回c(作成)で1から作り直すより、u(更新)で差分だけ反映する方が処理が速く済みます。ただし、更新を繰り返しているうちに不要な古いファイルが残ってしまうこともあるため、定期的にcで作り直してクリーンな状態を保つのも有効な運用です。実務では、日々の開発中はuで素早く反映し、リリース前には必ずcでクリーンビルドし直す、という使い分けが定番になっています。
jar cf:新規作成(既存ファイルがあれば上書き)jar uf:既存jarへの差分更新(新規追加・上書き)jar cfe:新規作成 + Main-Classの同時指定jar cfm:新規作成 + 独自マニフェストファイルの組み込み04 RUNNING JAR jarファイルの実行方法 基本の実行から、classpath指定時のOS差異まで
実行可能jarファイルは、java -jarコマンドで直接実行できます。
java -jar app.jar
このコマンドが動くには、jarファイル内のマニフェストにMain-Classが正しく指定されていることが前提です。指定がない、またはクラス名が間違っている場合は、実行時にエラーになります。
4-1. classpathを指定して実行する
外部のライブラリ(別のjarファイル)に依存するプログラムを実行する場合は、-cp(-classpathの略)オプションで、依存先のjarファイルも一緒に指定します。
# Windows環境
java -cp app.jar;lib\other.jar com.example.Main
# Linux / macOS環境
java -cp app.jar:lib/other.jar com.example.Main
classpathで複数のjarファイル・フォルダを指定する際の区切り文字は、Windowsではセミコロン(;)、Linux・macOSではコロン(:)です。この違いを知らずに他OS向けの手順をそのままコピペすると、正しく実行できません。チーム開発では、実行環境のOSに応じて手順を調整する必要があります。
📚 用語解説
classpath(クラスパス):Javaプログラムを実行する際、必要なクラスファイル・jarファイルがどこにあるかをJVM(Java仮想マシン)に伝えるための設定。複数の場所を指定する場合は、OSごとに定められた区切り文字(Windowsは;、Unix系は:)を使って並べます。
Main.java
コンパイル
→ .classファイル
Main-Classを指定して
jar化
実行可能jarを
そのまま実行
05 EXTRACTING JAR jarファイルの解凍・中身の確認方法 中身を取り出す・一覧を見る、それぞれの操作
5-1. jarファイルを解凍する
jarファイルの中身をファイルとして取り出したい場合は、x(extract)オプションを使います。
jar xf app.jar
# カレントディレクトリに中身が展開される
5-2. jarファイルの中身の一覧を見る
解凍せずに、jarファイルの中にどんなファイルが含まれているかだけを確認したい場合は、t(table)オプションを使います。
jar tf app.jar
# 出力例
META-INF/
META-INF/MANIFEST.MF
com/example/Main.class
v(verbose)オプションを追加すると、各ファイルの詳細な情報(サイズ・更新日時など)も一緒に表示されます。
jar tvf app.jar
5-3. マニフェストの中身だけを確認する
Main-Classの指定が正しく反映されているか確認したい場合は、マニフェストファイルだけを指定して解凍します。
jar xf app.jar META-INF/MANIFEST.MF
type META-INF\MANIFEST.MF # Windowsの場合
cat META-INF/MANIFEST.MF # Linux / macOSの場合
jar tf:中身の一覧だけを確認(解凍しない)jar xf:中身をすべて解凍するjar xf ファイル名 対象パス:特定のファイルだけを解凍する06 TROUBLESHOOTING よくあるエラーと注意点 実務で頻出するトラブルを原因別に整理
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| no main manifest attribute(Main-Classが見つからない) | マニフェストにMain-Classが指定されていない | jar cfeで再作成するか、マニフェストファイルにMain-Classを追記 |
| ClassNotFoundException | 依存先のクラス・jarがclasspathに含まれていない | -cpオプションで必要な依存先をすべて指定 |
| classpathの区切りが効かない | OSごとの区切り文字(; と :)を間違えている | 実行環境のOSに合わせて区切り文字を修正 |
| jar: command not found | JDKがインストールされていない、またはPATHが通っていない | JDKのインストール状況とPATH環境変数を確認 |
jarファイルの実行がうまくいかない時、多くの場合はマニフェストのMain-Class指定が原因です。前章で紹介したjar xf app.jar META-INF/MANIFEST.MFで中身を確認する癖をつけると、トラブルシューティングが早くなります。
6-1. バージョン不一致によるエラー
jarファイルをビルドした環境と、実行する環境のJavaバージョンが異なる場合、UnsupportedClassVersionErrorというエラーが発生することがあります。これは、新しいバージョンのJDKでコンパイルしたクラスファイルを、古いバージョンのJRE(実行環境)で動かそうとした際に起きる典型的な不一致です。
# エラー例
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/example/Main has been compiled by a more recent version of the Java Runtime
対処法は、コンパイル時に実行環境のバージョンに合わせて--releaseオプションを指定するか、実行環境側のJavaを最新版にアップデートすることです。開発環境と本番環境のJavaバージョンを揃えておくことが、そもそもの予防策として最も確実です。
java -versionで実行環境のバージョン、javac -versionでコンパイラのバージョンを確認できます。ビルド環境と実行環境の両方で確認し、差異がないかチェックする習慣をつけておくと安心です。
07 BUSINESS RISK なぜビルドの細かいミスは経営リスクなのか 技術的な話を、経営者が判断できる言葉に翻訳する
ここまで解説してきた「Main-Classの指定漏れ」「classpathのOS差異」は、単なる技術的な手間ではなく、納期やコストに直結する経営リスクでもあります。
小さなミス
Main-Class
記述漏れ等
実行エラー発覚
検証環境で
初めて判明
手戻りコスト
原因調査に
時間を要する
特に外部の開発会社やフリーランスにシステム開発を発注している場合、「納品されたjarファイルが検証環境で動かない」というトラブルは決して珍しくありません。原因の多くは、この記事で紹介したような基本的な設定ミスです。
08 GENAI CASE STUDY Claude Codeでビルド事故を減らすという選択肢 弊社GENAIの実運用データで見る、パッケージングの確認フロー
弊社(株式会社GENAI)ではClaude Max 20xプラン(月額$200・約30,000円)を契約し、経営・営業・広告・開発・経理・秘書業務まで社内のあらゆる業務でClaude Codeを活用しています。開発領域では、ビルド設定の確認もその一つです。
Claude Codeは、「このjarファイルのマニフェストにMain-Classが正しく設定されているか確認して」と日本語で頼むだけで、中身を展開して確認し、問題があれば指摘してくれます。OSごとのclasspath指定の違いのような、見落としがちなポイントも機械的にチェックできる領域です。
| チェック内容 | 人力確認のみの場合 | Claude Codeを併用する場合 |
|---|---|---|
| Main-Classの指定漏れ | 実行して初めて気づくことが多い | 事前にマニフェストの中身を確認 |
| classpathのOS差異 | 実行環境ごとに手順書を書き分ける必要 | 該当環境向けのコマンドを都度生成 |
| 依存ライブラリの不足 | エラーログを見て手動で調査 | ClassNotFoundExceptionの原因を特定 |
| 確認にかかる時間 | 担当者の稼働に依存 | 即座に初期チェックが完了 |
弊社の開発領域(WordPress・LP制作・各種スクリプトの書き捨て等)では、成果物の受け渡し前にこうした確認作業をClaude Codeに任せることで、都度数時間かかっていた確認作業がその場で完結する肌感で削減できています。
本章の削減時間は弊社の肌感ベースの参考値であり、業種・業態・担当者のスキルによって変動します。「完全自動化」ではなく、最終確認は引き続き人の判断が必要です。
8-1. 「納品後に発覚する」から「納品前に検知する」へ
弊社がClaude Codeを導入して最も大きく変わったのは、「動作確認」というプロセスが、納品後ではなく納品前の当たり前の工程になったことです。以前は、外注先やメンバーが作成したビルド成果物を受け取ってから初めて動作確認するケースもありましたが、現在は成果物が完成した時点でClaude Codeに確認を挟む運用に変えています。
これは、特別なスキルを持つ担当者を新たに雇う必要がないという点でも合理的です。「確認する」という行為自体は、技術に詳しくない人でもClaude Codeに依頼すれば実行できるため、担当者のスキルに依存しない品質チェック体制を作れます。
8-2. 外注先とのやり取りにも活用できる
外部の開発会社やフリーランスから納品物を受け取る際も、「この納品物を実際に動かして、想定通り動くか確認して」とClaude Codeに依頼することで、専門知識がなくても一次チェックを済ませられます。「動作確認済みです」という報告を鵜呑みにせず、自社でも簡易的な検証を行える体制は、発注者側のリスク管理として有効です。
09 CONCLUSION まとめ ── 「作れた」と「動く」は別の基準 基本を正しく押さえたうえで、組織としての確認体制を両立させる
この記事では、jarファイルの基本構造から、作成・実行・解凍のコマンド、よくあるエラー、そしてそれが経営リスクにつながる構造までを整理しました。最後にポイントを振り返ります。
jar cf app.jar Main.class、実行可能jarはjar cfe app.jar Main *.class(パッケージ使用時はディレクトリごと指定)java -jar app.jar。マニフェストのMain-Class指定が前提jar xf、中身の一覧確認はjar tfjarファイルのコマンド自体はシンプルですが、「作れた」と「正しく動く」の間にギャップがある典型例です。このギャップを個人の注意力だけで埋め続けるのではなく、機械的なチェックを組み合わせて組織として確認体制を整える、という発想が重要になります。
次にjarファイルを作成・納品する、あるいは受け取る機会があれば、この記事で紹介したコマンド一覧とチェックリストを見返してみてください。「作れた」で終わらせず「動くことを確認した」まで一貫させることが、手戻りコストを防ぐ一番の近道です。
Javaに限らず、パッケージング・ビルドの工程は、開発の中でも特に地味で見落とされやすい領域です。だからこそ、確認の仕組みを整えている組織とそうでない組織の差が、トラブル発生時に大きく表れます。日頃の小さな確認の積み重ねが、いざという時の信頼につながります。
納品物の確認フローを、Claude Codeで仕組み化しませんか
マニフェストの指定漏れのような細かいミスを、個人の注意力だけに頼らない体制づくりを支援します。
弊社の実運用ノウハウをベースに、個別に導入設計のご相談を承ります。
ここから先の進め方は、大きく2つあります。
自社で回せるようになりたい方は、AI鬼管理でClaude Code/Codexの使い方から業務設計・社内定着まで伴走を受けながら、社内に仕組みを作る道があります。
覚えるより任せたい方は、AI社員AIKATAでこの記事のような定型業務を丸ごと預ける道があります。料金は月30万円の月額定額、追加費用は0円です。
どちらが合うかは、業務量と社内体制次第です。無料相談・無料適合診断で、貴社の場合はどちらが向くかからご相談いただけます。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. java -jarで実行すると「no main manifest attribute」と出るのはなぜですか?
A. jarファイルのマニフェストにMain-Classが指定されていないためです。jar cfeコマンドでエントリポイントを指定して作成し直すか、Main-Classを記載したマニフェストファイルを使って再作成してください。
Q. classpathの区切り文字を間違えるとどうなりますか?
A. 指定した依存先が正しく認識されず、ClassNotFoundExceptionなどのエラーになります。Windowsはセミコロン(;)、Linux・macOSはコロン(:)と、OSによって区切り文字が異なる点に注意してください。
Q. jarファイルはZIP解凍ソフトで開けますか?
A. 開けます。jarファイルは内部的にZIP形式と同じ圧縮方式が使われているため、拡張子を.zipに変更すれば一般的な解凍ソフトでも中身を確認できます。ただし実務ではjarコマンドを使う方が確実です。
Q. マニフェストファイルを手動で作る際の注意点は何ですか?
A. 最終行の末尾に改行を入れておくことが重要です。改行がないと、記述したMain-Class等の指定が正しく認識されないことがあります。保存後にファイルの末尾を確認する習慣をつけると安心です。
Q. 実行可能jarとライブラリ用jarの違いは何ですか?
A. 実行可能jarはマニフェストにMain-Classが指定されており、java -jarコマンドで単体実行できます。ライブラリ用jarはMain-Classを持たず、他のプログラムからクラスパス経由で読み込まれる前提で作られます。
Q. 非エンジニアの経営者は、こうしたビルドの細部をどこまで理解すべきですか?
A. コマンドを暗記する必要はありませんが、「納品直前に発覚すると手戻りが大きい」という構造は理解しておくべきです。そのうえで、Claude Codeなどによる機械的な確認体制を組織としてどう作るかを判断するのが経営者の役割です。
Q. UnsupportedClassVersionErrorが出た場合、どう対処すればいいですか?
A. ビルド環境と実行環境のJavaバージョンが一致していないことが原因です。java -versionとjavac -versionで両者のバージョンを確認し、実行環境に合わせてコンパイル時の--releaseオプションを指定するか、実行環境のJavaをアップデートしてください。
Q. jarファイルとwarファイル、社内ツールを作る場合どちらを使えばいいですか?
A. 単体で動くデスクトップアプリやコマンドラインツールであればjarファイルで十分です。ブラウザからアクセスするWebアプリケーションとして提供する場合は、Tomcat等にデプロイするwarファイルの形式を検討してください。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AI社員AIKATAへのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




