MEDIA

メディア

  1. TOP
  2. メディア
  3. プログラミング
  4. java -jarの使い方|引数・パス・起動失敗の切り分けまで

java -jarの使い方|引数・パス・起動失敗の切り分けまで

まず、java -jar は、配布されたJARアプリをコマンドラインから起動する代表的な方法です。

しかし、実務で詰まりやすいのはコマンド自体ではなく、実行環境(どのJavaで動いているか)JARの作り(MANIFEST、依存関係、起動ディレクトリ)です。

そのため本記事では、「-jarの意味」から「実行前の環境確認」「引数やオプションの渡し方」「パスと実行ディレクトリの注意」「起動できないときの切り分け」「よくあるエラー対処」「ログの見方」まで、再現性の高い手順として整理します。

また、Javaの全体像や学習の流れを先に整理したい場合は、内部リンクとして「Javaの使い方を完全解説:基礎から応用までステップバイステップで理解する」も合わせて読むと理解が早まります。

-jarとは何か

まず、-jarjava コマンドに対して「クラス名ではなくJARファイルをエントリポイントとして起動する」ことを指示するオプションです。

さらに重要なのは、-jar を使う場合、指定したJARが「ユーザークラスの起点」として扱われ、他のクラスパス設定が無視される点です。

そのため、起動前提は「実行可能JAR」であることです。具体的には、JAR内の META-INF/MANIFEST.MFMain-Class が設定されている必要があります。

実行前に確認すること(Java/JDK・PATH)

まず、実行トラブルの多くは「Javaが入っていない」「別バージョンが呼ばれている」「PATHが通っていない」など環境起因です。

そのため、最初に java -version を実行し、想定のバージョンが表示されるかを確認します。

java -version

次に、どの java 実体が呼ばれているかを確認します。macOS/Linuxなら which java、Windowsなら where java が定番です。

# macOS/Linux
which java

# Windows
where java

さらに、運用で診断するなら jcmd などJDK側のツールが必要になる場面があります。したがって、チーム運用やサーバ調査があるなら、最初からJDKを入れておくと事故が減ります。

JARファイルを実行する基本形

まず、基本形は次のとおりです。カレントディレクトリにJARがあるならそのまま、別の場所ならパスを付けて指定します。

java -jar app.jar

しかし、「起動できるJARかどうか」を素早く見るには、JARを解凍せずに中身を確認するのが有効です。

例えば、jar tf で内容一覧を出し、META-INF/MANIFEST.MF が存在するかを確認します(JARの中身確認の公式手順例もあります)。

jar tf app.jar

そのうえで、起動直後に落ちるケースは、アプリ側の例外だけでなく「設定ファイルが見つからない」「起動ディレクトリが想定と違う」「ポート使用中」など外部要因も多いです。

したがって、標準エラーに出た最初の例外(最上段の原因)を読む癖を付けると、遠回りしません。

オプションと引数を付けて実行する

まず、Javaオプション(JVM向け)とアプリ引数(main(String[] args)向け)は付ける位置が異なります。

原則として、-jar より前はJVMオプションJAR名より後ろはアプリ引数です。

java -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -jar app.jar --port 8080 --config ./config/app.yml

さらに、よく使うJVMオプションには、文字コード指定(例:-Dfile.encoding=UTF-8)、システムプロパティ(-Dkey=value)、メモリ設定(-Xms/-Xmx)などがあります。

そのため、運用では「何をJVMで制御し、何をアプリ設定に寄せるか」を決めておくと、環境差分が減ります。

一方で、引数にスペースを含む値(パスなど)を渡す場合はクォートが必要です。OSやシェルで解釈が違うため、起動スクリプトに落とし込むときは同じ実行環境で検証してください。

実行ディレクトリとパス指定の考え方

まず、相対パスでの設定ファイル参照やログ出力先は「どのディレクトリから起動したか」に強く影響されます。

つまり、java -jar は「JARが置かれている場所」ではなく「コマンドを打った場所(カレントディレクトリ)」を基準に相対パスが解釈されがちです。

例えば、設定ファイルを ./config/app.yml と書いていると、起動場所が変わるだけで見つからなくなります。

そこで、安定させる方法は大きく2つです。

  • 絶対パスで渡す(環境変数や起動引数で注入する)
  • 起動スクリプト側で作業ディレクトリを明示的に移動してから実行する

例えば、Linuxでの型は次のようになります。

#!/bin/sh
cd /opt/myapp || exit 1
exec java -Xms256m -Xmx512m -jar ./app.jar --config /etc/myapp/app.yml

さらに一段深いポイントとして、参照する“パスの種類”を分けて考えると事故が減ります。

  • クラスパス上のリソース(JAR内に同梱するもの)
  • 外部ファイル(運用で差し替えるもの)

したがって、運用で変えるものは外部化し、参照方法を起動引数で統一するのが定石です。

実行できないときの原因を切り分ける

まず、切り分けは「コマンドが実行できる層」→「JARが実行可能な層」→「アプリが起動後に落ちる層」の順に進めると最短です。

1. コマンドとファイル到達性を確認する

まず、java -version が通るかを確認します。次に、JARのパスが正しいか、読み取り権限があるかを確認します。

特にLinuxで実行ユーザーが違う場合、権限不足が起きやすいので注意してください。

2. 実行可能JARかを確認する

次に、MANIFESTの Main-Class があるかを疑います。-jar は、マニフェストに Main-Class があるJARを前提に起動します。

さらに、-jar 使用時は他のクラスパス設定が無視されるため、依存ライブラリを含む形式(fat jar等)なのかも併せて確認します。

3. 起動後に落ちる場合は「失敗地点」をログで特定する

最後に、アプリが起動はしたが落ちる場合は、標準エラーの先頭の例外、設定ファイルの読み込み、外部接続(DBやAPI)、ポート競合など、どこで失敗しているかを特定します。

そのため、JAR単体の問題か、環境依存(ファイル/ネットワーク/権限)かを先に分けるのがコツです。

よくあるエラーと対処法

Unable to access jarfile xxx.jar

まず、指定したパスが間違っている、ファイル名の大文字小文字が違う、実行ユーザーに読み取り権限がない、のいずれかが多いです。

したがって、ls(Windowsならdir)で実在確認し、相対パスならカレントディレクトリも確認します。

no main manifest attribute

次に、実行可能JARになっていないサインです。マニフェストに Main-Class が入っていないため、-jar</code では起動できません。

そのため、ビルド設定(Maven/Gradleのjar設定等)を見直します。提供物で直せない場合は、提供元に「実行可能JARか、起動手順(クラスパス含む)を提示してほしい」と依頼するのが現実的です。

UnsupportedClassVersionError

一方で、実行しているJavaが古く、JARがより新しいJavaでコンパイルされている状態です。

まず java -version を確認し、要求されるバージョンに合わせます。さらに、実行環境のJavaを固定(コンテナ化や起動スクリプトで明示)すると再発防止になります。

実行結果の確認とログ出力の扱い

まず、画面に出る出力には標準出力と標準エラーがあります。例外は標準エラー側に出ることが多いです。

そのため、運用では標準エラーも含めてログに残す設計が重要です。落ちた瞬間の最初の例外が残るように、ローテーションや保存先権限まで含めて設計します。

さらに、JARの中身確認やマニフェスト確認など、公式資料も参照すると判断が速くなります(OracleのJARチュートリアル等)。

まとめ

まず、java -jar は、マニフェストの Main-Class を起点にJARを起動するためのオプションで、実行可能JARであることが前提です。

さらに、オプションの位置は「-jar より前がJVM向け」「JAR名より後ろがアプリ向け」と覚えると、メモリ設定やアプリ引数の混乱が減ります。

そして、実務で詰まりやすいのは実行ディレクトリと相対パスです。したがって、絶対パスで渡す、起動スクリプトで作業ディレクトリを固定する、設定を外部化する、といった方針を決めておくと、起動失敗や設定未反映の事故を大きく減らせます。

また、エンジニアとしてのキャリアや仕事内容の全体像も押さえておきたい方は、「エンジニアとは?仕事内容・種類・キャリアをわかりやすく解説」も参考になります。

つまずいたら、現役エンジニアと一緒に解決しよう

この記事で扱ったは、独学だと細部で詰まりやすい分野です。さらに理解を深めたい方は、Zerocodeで実務直結の学習を進めてみませんか。

現役エンジニア1on1

コード添削・詰まり解消を丁寧にサポート。

実務設計まで網羅

Java/SQL/Spring Bootを体系的に習得。

ポートフォリオ支援

現場で刺さる成果物づくりを伴走。

完全オンライン

時間と場所を選ばず学べます。

Join us! 未経験からエンジニアに挑戦できる環境で自分の可能性を信じてみよう 採用ページを見る→

記事監修

ドライブライン編集部

[ この記事をシェアする ]

記事一覧へ戻る