IntelliJ IDEAでjarファイルを作成する完全ガイド

はい、承知いたしました。IntelliJ IDEAでJARファイルを作成する手順を詳細に解説する、約5000語の「完全ガイド」記事を作成します。記事形式で直接表示します。


IntelliJ IDEAでJARファイルを作成する完全ガイド

ソフトウェア開発において、作成したJavaアプリケーションを配布したり、他のプロジェクトで再利用可能なライブラリとしてパッケージ化したりする際に、JARファイルは不可欠な形式です。JAR (Java ARchive) ファイルは、複数のJavaクラスファイル、関連するメタデータ、リソースファイルなどを一つにまとめたファイル形式であり、Javaプラットフォームのポータビリティと配布の容易さを実現しています。

統合開発環境(IDE)であるIntelliJ IDEAは、Java開発において強力な機能を提供しており、JARファイルの作成も効率的かつ直感的に行うことができます。この記事では、IntelliJ IDEAを使用してJARファイルを作成するためのあらゆる側面を網羅した完全なガイドを提供します。Artifacts機能を使った標準的な方法から、ビルドツールとの連携、さらには詳細な設定やトラブルシューティングまで、幅広く深く解説していきます。

この記事は、IntelliJ IDEAを使ったJavaプロジェクトの開発経験があり、作成したコードをJARファイルとしてパッケージ化したいと考えている開発者を対象としています。この記事を読み終える頃には、あなたのプロジェクトから目的に合ったJARファイルを正確に作成できるようになるでしょう。

さあ、IntelliJ IDEAでのJAR作成の世界へ深く踏み込んでいきましょう。

1. JARファイルの基本を理解する

IntelliJ IDEAでの具体的な手順に入る前に、まずはJARファイルそのものについての基本的な知識を確認しておきましょう。これにより、IntelliJ IDEAでの設定の意味がより深く理解できるようになります。

1.1. JARファイルとは?

JARファイルは、Javaクラスファイル(.class)、リソースファイル(画像、設定ファイルなど)、およびメタデータを含むファイルシステム構造をZIP形式で圧縮したものです。基本的にZIPファイルと同じ構造を持ち、標準のZIPツールで展開することができます。

JARファイルの主な目的は以下の通りです。

  • 配布の容易さ: 複数のファイルを単一のファイルにまとめることで、アプリケーションやライブラリの配布が容易になります。
  • ファイルサイズの削減: ZIP圧縮により、ファイルサイズを小さくすることができます。
  • 実行可能なアプリケーション: MANIFEST.MFファイルに特定のエントリポイント(メインクラス)を指定することで、直接実行可能なアプリケーションとして配布できます。
  • ライブラリのパッケージ化: 再利用可能なコード群をライブラリとしてまとめ、他のプロジェクトから簡単に利用できるようにします。
  • セキュリティ: オプションでJARファイルにデジタル署名を施すことで、コードの出所と完全性を保証できます。

1.2. JARファイルの内部構造

標準的なJARファイルは、通常以下のような構造を持っています。

my_application.jar
├── META-INF/
│ └── MANIFEST.MF
├── com/
│ └── example/
│ └── MyClass.class
│ └── AnotherClass.class
├── resources/
│ └── config.properties
│ └── images/
│ └── logo.png
└── other_files_or_directories...

  • META-INF/ ディレクトリ: このディレクトリはJARファイルに関するメタデータを含みます。最も重要なファイルは MANIFEST.MF です。
  • META-INF/MANIFEST.MF: このファイルはJARファイルのマニフェストファイルと呼ばれ、JARファイルの内容に関する様々な情報を提供します。例えば、アーカイブの作成者、バージョン情報、デジタル署名情報、そして実行可能なJARファイルにおいては起動するメインクラスの指定などが記述されます。
  • クラスファイル: パッケージ構造に従って配置された .class ファイル群です。
  • リソースファイル: クラスファイル以外の、アプリケーションが必要とする各種データファイルです。
  • その他のファイル/ディレクトリ: JARファイルに含めたい任意のファイルやディレクトリを含めることができます。

1.3. 実行可能なJARとそうでないJAR

JARファイルは、その用途によって大きく二つの種類に分けられます。

  1. ライブラリJAR: 他のJavaプログラムから利用されることを目的としたJARファイルです。特定のクラスやリソースを含みますが、単体では実行できません。MANIFEST.MFファイルは必須ではありませんが、含める場合でもメインクラスの指定は通常行いません。
  2. 実行可能なJAR (Executable JAR): それ自体が一つのアプリケーションとして実行可能なJARファイルです。これを作成するには、META-INF/MANIFEST.MFファイルに Main-Class 属性を指定する必要があります。この属性に指定されたクラスが、java -jar your_jar_file.jar コマンドでJARを実行した際に最初に実行されるクラスとなります。

実行可能なJARを作成する場合、依存する外部ライブラリの扱いが重要になります。依存ライブラリをどのように含めるかによって、JARファイルの構造や実行方法が変わってきます。これについては後述します。

1.4. 依存関係の扱い

あなたのプロジェクトがSpring、Apache Commons、サードパーティ製のJDBCドライバなど、外部のライブラリに依存している場合、その依存関係を最終的なJARファイルに含めるか、または実行時にアクセス可能な場所に配置する必要があります。依存関係の扱いにはいくつかの一般的な方法があります。

  • Fat JAR (または Uber JAR): 依存するすべてのライブラリのクラスファイルを、メインのJARファイルの中に直接含める方法です。単一のファイルで配布できるため非常に手軽ですが、JARファイルが巨大になりやすく、異なるライブラリ間で同じクラス名が存在する場合に問題(依存関係の衝突)が発生する可能性があります。
  • 依存ライブラリを外部に配置: メインのJARファイルには自作のクラスのみを含め、依存するライブラリのJARファイルはメインのJARファイルと同じディレクトリ、または指定されたディレクトリに配置する方法です。実行可能なJARの場合、MANIFEST.MFClass-Path属性を使って、依存ライブラリのパスを指定します。こちらはファイルサイズが小さく保たれ、依存関係の衝突が起こりにくいですが、配布時にはメインのJARファイルだけでなく、すべての依存ライブラリも一緒に配布する必要があります。
  • モジュールパス (Java 9以降): Java Platform Module System (JPMS) を利用する場合、依存関係をモジュールとして扱い、モジュールパス上に配置して実行します。これはJava 9以降の高度な機能であり、この記事では主に従来のクラスパスベースのJAR作成に焦点を当てますが、現代的な開発においては重要な選択肢です。

IntelliJ IDEAのArtifacts機能は、これらの依存関係の扱い方に対して柔軟な設定を提供します。

2. IntelliJ IDEAでのJAR作成方法:概観

IntelliJ IDEAでJARファイルを作成するには、主に以下の二つのアプローチがあります。

  1. IntelliJ IDEAのArtifacts機能を使用する: IntelliJ IDEAに組み込まれているビルドシステムを利用して、プロジェクトの成果物(Artifacts)としてJARファイルを定義し、ビルドする方法です。IDEのGUI上で設定できるため、直感的で手軽です。特に、プロジェクトが複雑なビルドツール構成を持っていない場合や、IDE上で素早くカスタムJARを作成したい場合に適しています。
  2. ビルドツール(MavenまたはGradle)を使用する: プロジェクトがMavenやGradleといった標準的なビルドツールを使用している場合、これらのツールにJAR作成の設定を記述し、IntelliJ IDEAはそのビルドプロセスを実行するためのインターフェースとして利用します。ビルドの設定がプロジェクトファイル(pom.xmlbuild.gradle)に記述されるため、環境に依存せず、チーム開発において設定を共有しやすいという利点があります。

この記事では、主にIntelliJ IDEAのArtifacts機能を使ったJAR作成方法に焦点を当てて詳細に解説します。Artifacts機能は、ビルドツールを使っていないプロジェクトでもJARを作成でき、またビルドツールを使用しているプロジェクトでも、ビルドツールの設定とは別に特定の目的のためにカスタムJARを作成したい場合に非常に便利だからです。ビルドツールを使った方法についても、後半でその概要とIntelliJ IDEAでの利用方法を簡単に紹介します。

それでは、Artifacts機能を使ったJAR作成手順を詳しく見ていきましょう。

3. Artifactsを使ったJAR作成:ステップバイステップガイド

IntelliJ IDEAのArtifacts機能を使ってJARファイルを作成するプロセスは、主に「Artifactsの設定」と「Artifactのビルド」の二つの段階に分かれます。

3.1. ステップ1: Artifactsの設定画面を開く

まず、プロジェクトのビルド設定を行うための「Project Structure」ダイアログを開きます。

  1. IntelliJ IDEAのメニューバーから File -> Project Structure... (macOSでは IntelliJ IDEA -> Preferences... -> Project Structure) を選択します。または、ツールバーのプロジェクト構造アイコン(レンチとハンマーのアイコン)をクリックします。
  2. 開いた「Project Structure」ダイアログの左側のペインで、「Project Settings」の下にある Artifacts を選択します。

この Artifacts セクションで、プロジェクトから生成したい成果物(この場合はJARファイル)の定義を行います。

3.2. ステップ2: 新しいArtifactを追加する

Artifactsセクションを開くと、既存のArtifactsのリストが表示されます(最初は空の場合が多い)。新しいJAR Artifactを作成するために、以下の手順を行います。

  1. 画面上部のツールバーにある + ボタンをクリックします。
  2. ドロップダウンメニューが表示されるので、JAR を選択します。
  3. さらにサブメニューが表示されます。ここでJARファイルに含める内容に応じて以下のいずれかを選択します。

    • From modules with dependencies... (推奨): プロジェクト内のモジュールと、そのモジュールが依存しているライブラリを自動的に収集してJARを作成する際に使用します。ほとんどの場合、このオプションが最も手軽で適切です。このオプションを選択すると、どのモジュールをベースにするか、どの依存関係を含めるかなどを設定するダイアログが表示されます。
    • Empty: まったく空の状態から手動でJARファイルの内容を構築する場合に選択します。特定のファイルやディレクトリだけを含めたい場合や、高度なカスタマイズが必要な場合に使用します。
    • From files...: プロジェクト内の特定のファイルやディレクトリだけを選択してJARを作成する場合に選択します。

ここでは、最も一般的で推奨される From modules with dependencies... を選択した場合を前提に説明を進めます。

From modules with dependencies... を選択すると、「Create JAR from Modules」ダイアログが表示されます。

  • Module: JARを作成したいモジュールを選択します。通常は、アプリケーションのエントリポイントが含まれるモジュールや、ライブラリとしてパッケージ化したいコードが含まれるモジュールを選択します。
  • Main Class: 実行可能なJARを作成したい場合、ここでアプリケーションのエントリポイントとなるメインクラス(public static void main(String[] args) メソッドを持つクラス)を指定します。IntelliJ IDEAはプロジェクト内のクラスをスキャンして候補を表示してくれます。ドロップダウンリストから選択するか、手動でクラス名をフルパッケージ名で入力します。実行可能なJARでない(ライブラリとして使用する)場合は、空白のままで構いません。
  • Dependency handling: 依存ライブラリをどのように扱うかを選択します。
    • extract to the target JAR: 依存ライブラリのクラスファイルをすべてメインのJARファイル内に展開して含めます(Fat JAR)。
    • copy to the output directory and link via manifest: 依存ライブラリのJARファイルをメインのJARファイルとは別に、指定された出力ディレクトリにコピーし、メインJARのMANIFEST.MFファイルのClass-Path属性でそれらのJARファイルへのパスを記述します(推奨)。

通常は、copy to the output directory and link via manifest を選択するのが良いでしょう。extract to the target JAR は手軽ですが、前述のように依存関係の衝突のリスクがあり、また異なるライブラリの同じクラスが複数含まれることでファイルサイズが無駄に大きくなる可能性もあります。

設定が完了したら、「OK」をクリックします。

3.3. ステップ3: Artifactsの設定を詳細にカスタマイズする

「OK」をクリックすると、Artifacts設定画面に戻りますが、新しく作成されたArtifactがリストに追加され、その詳細設定ペインが表示されます。ここでArtifactsの構成をさらに細かく調整します。

Artifacts設定ペインは主に以下の部分から構成されます。

  • Name: Artifactの名前。IntelliJ IDEA内でこのArtifactを識別するために使われます。デフォルトでモジュール名に基づいた名前がつけられますが、分かりやすい名前に変更できます(例: MyApplication-executable-jar, MyLibrary-jar)。
  • Output Directory: 作成されたJARファイルが出力されるディレクトリを指定します。デフォルトでは out/artifacts/<Artifact Name> のようなパスが設定されます。参照ボタン ... をクリックして任意のディレクトリに変更できます。ビルドパスにスペースが含まれないように注意すると、コマンドラインからの実行時にトラブルを避けられます。
  • Type: Artifactのタイプが表示されます(ここでは JAR)。
  • Include in project build: このチェックボックスをオンにすると、プロジェクト全体のビルド (Build -> Build Project) を実行した際に、このArtifactも自動的にビルドされます。開発中はオフにしておき、必要な時に手動でビルドすることもできます。
  • Output Layout: これが最も重要な部分で、最終的にJARファイル内にどのような構造で、どのファイルが配置されるかを定義します。左側のペインにはJARファイルのルートが表示され、そこにファイルやディレクトリを追加していきます。
    • META-INF ディレクトリ: JARファイルには必ず META-INF ディレクトリが必要です。通常、このディレクトリ内に MANIFEST.MF ファイルが配置されます。
    • モジュールの出力: プロジェクトのモジュールをビルドして生成されたクラスファイルやリソースファイル(out/production/<module_name> ディレクトリの内容など)を含める場合に、この要素を追加します。
    • ライブラリ: プロジェクトが依存しているライブラリを含める場合に表示されます。
    • ファイル/ディレクトリ: プロジェクト内の特定のファイルやディレクトリをJARに含めたい場合に手動で追加します。
  • Available Elements: 右側のペインには、プロジェクト内でArtifactに含めることのできる要素(モジュール、ライブラリ、ファイル、ディレクトリなど)のリストが表示されます。ここから必要な要素をドラッグ&ドロップでOutput Layoutに追加したり、右クリックメニューから追加したりできます。

3.3.1. Output Layoutの詳細設定

From modules with dependencies... でArtifactを作成した場合、Output Layoutはデフォルトで以下のような構成になっているはずです。

<Artifact Name>
├── META-INF/
│ └── MANIFEST.MF
├── <Module Output: my_module> <- この要素は、モジュールをビルドした結果(.classファイルなど)を含める
├── <Extracted 'my_library.jar'> <- 'extract...' を選んだ場合、ライブラリの内容がここに展開される
└── <my_library.jar> <- 'copy...' を選んだ場合、ライブラリJAR自体がコピーされる

ここで重要な設定項目をさらに詳しく見ていきましょう。

META-INF/MANIFEST.MF の設定:

MANIFEST.MF ファイルはJARファイルにおいて非常に重要な役割を果たします。特に実行可能なJARを作成する場合は必須です。

  • デフォルトのマニフェスト: Artifactを作成した際に、IntelliJ IDEAはデフォルトの MANIFEST.MF ファイルを自動的に作成し、META-INF ディレクトリの下に配置します。このデフォルトファイルには、Artifactの作成元に関する情報などが含まれる場合があります。
  • Main Classの設定: 実行可能なJARにするには、このマニフェストファイルに Main-Class 属性を追加する必要があります。
    • Output Layoutツリーで META-INF/MANIFEST.MF を選択します。
    • 右側のペイン(またはArtifacts設定画面下部のペイン)に、マニフェストファイルの設定オプションが表示されます。
    • Main class: フィールドに、実行したいメインクラスの完全修飾名(例: com.example.myapp.ApplicationMain)を入力または選択します。From modules with dependencies... でArtifactを作成した際に既に指定している場合は、ここに入力されています。
    • Use existing MANIFEST.MF: プロジェクト内に手動で作成した MANIFEST.MF ファイルがある場合、それを使用することもできます。このオプションをチェックし、ファイルパスを指定します。ただし、IntelliJ IDEAによる自動生成や管理の方が便利な場合が多いです。
  • Class-Path 属性: copy to the output directory and link via manifest を選択して依存ライブラリを外部に配置する場合、IntelliJ IDEAは自動的に MANIFEST.MF ファイルに Class-Path 属性を追加し、依存ライブラリのJARファイル名をリストします。これにより、JVMは実行時に依存ライブラリを見つけることができます。手動でパスを追加することも可能ですが、通常は自動生成されたもので十分です。Class-Path に記述するパスは、JARファイルを実行するカレントディレクトリからの相対パスになります。

Output Layoutのカスタマイズ:

Output Layoutのツリー構造を操作して、JARファイルに含める内容や配置を細かく調整できます。

  • 要素の追加: 右側の Available Elements ペインから、モジュール出力、ライブラリ、特定のファイルやディレクトリをOutput Layoutのツリーの任意の位置にドラッグ&ドロップすることで追加できます。または、Output Layoutツリー内のディレクトリを選択した状態で右クリックし、Put into Output Root, Extract Into, Add Copy Of などから選択して追加することもできます。
    • Module Output: プロジェクトモジュールをビルドして生成された .class ファイルやリソースファイルを、パッケージ構造を保ったまま追加します。これがJARの本体となります。
    • Libraries: プロジェクトが依存しているライブラリを追加します。Extracted (Fat JAR) または Copy to Output Root (外部配置) のどちらかを選択できます。Copy to Output Root を選択すると、ライブラリのJARファイルそのものがOutput Directoryにコピーされます。
    • File, Directory: プロジェクトツリーから任意のファイルやディレクトリをJARに含めることができます。例えば、設定ファイルや静的アセットなどを特定のディレクトリに配置したい場合に便利です。
  • 要素の削除: Output Layoutツリー内の不要な要素を選択し、キーボードの Delete キーを押すか、右クリックメニューから Remove を選択して削除できます。
  • 要素の移動: Output Layoutツリー内で要素をドラッグ&ドロップすることで、JARファイル内の配置場所を変更できます。例えば、特定のファイルを META-INF ディレクトリの下に移動させたり、リソースファイルを resources という新しいディレクトリの下にまとめたりできます。ディレクトリを右クリックして New Directory を選択し、新しいディレクトリを作成することもできます。
  • 依存ライブラリのフィルタリング: From modules with dependencies... で追加された依存ライブラリのリストに対して、含めるもの/含めないものを選別できます。特定の依存関係だけを除外したい場合に便利です。

3.3.2. 依存関係の扱いに関する補足

From modules with dependencies... オプションを選択した場合、IntelliJ IDEAは自動的にプロジェクトの依存関係グラフを解析し、必要なライブラリをリストアップしてくれます。

  • extract to the target JAR (Fat JAR): このオプションを選択すると、依存ライブラリのJARファイルの中身(.classファイルなど)がすべて展開され、メインのJARファイルの中に直接コピーされます。これにより、依存ライブラリ自体は別途必要なくなり、単一のJARファイルを実行するだけでアプリケーションが動作します。ただし、前述のデメリット(ファイルサイズの増加、衝突リスク)があります。特に大規模なプロジェクトや多数の依存関係がある場合は注意が必要です。META-INFディレクトリ直下に展開されることが多いため、元のライブラリJARのマニフェストファイルなどが衝突しないように注意が必要です。
  • copy to the output directory and link via manifest (外部配置): このオプションを選択すると、依存ライブラリのJARファイルは、メインのJARファイルが生成されるOutput Directoryにそのままコピーされます。そして、メインJARのMETA-INF/MANIFEST.MFファイルには、Class-Path属性が追加され、コピーされた依存ライブラリのファイル名がリストされます。実行時には、メインJARとこれらの依存ライブラリJARが同じディレクトリにある必要があります。配布ファイルが複数になりますが、依存関係の管理が比較的容易で、JARファイルサイズも小さく保たれます。

どちらの方法を選択するかは、アプリケーションの性質、配布方法、依存関係の複雑さによって決定します。IntelliJ IDEAのArtifacts機能は、どちらのオプションも簡単に設定できます。

3.3.3. その他のArtifact設定

Artifacts設定画面には他にもいくつかの詳細設定があります。

  • Post-processing: Artifactビルド後に実行される追加の処理を指定できます。例えば、別のディレクトリにファイルをコピーしたり、カスタムスクリプトを実行したりといったことが可能です。
  • JAR Manifest attributes: MANIFEST.MFファイルに Main-ClassClass-Path 以外に、カスタム属性を追加したい場合に利用します。例えば、Implementation-VersionImplementation-Vendor といった情報を追加できます。
  • Signing: JARファイルにデジタル署名を施すための設定です。キーストアのパス、エイリアス、パスワードなどを指定します。署名されたJARファイルは、Webブラウザで実行されるアプレットやJava Web Startアプリケーションなどで、セキュリティ上の信頼性を示すために使用されます。

必要な設定がすべて完了したら、画面下部の Apply または OK ボタンをクリックして設定を保存します。これでJAR Artifactの定義が完了しました。

3.4. ステップ4: Artifactをビルドする

Artifactの設定を保存したら、いよいよ実際にJARファイルを生成する「ビルド」プロセスを実行します。

  1. IntelliJ IDEAのメニューバーから Build -> Build Artifacts... を選択します。
  2. 作成したArtifactの名前(例: MyApplication-executable-jar)を含むサブメニューが表示されます。
  3. 作成したいArtifactを選択し、以下のいずれかのビルドオプションを選択します。

    • Build: Artifactを増分ビルドします。前回のビルド以降に変更された部分のみを再ビルドするため、通常は最も高速です。
    • Rebuild: Artifactを最初から完全に再ビルドします。クリーンな状態からビルドしたい場合や、増分ビルドで問題が発生した場合に使用します。
    • Clean: ビルドによって生成されたArtifact関連のファイル(出力ディレクトリの内容など)を削除します。

通常は Build を選択すれば十分です。Rebuild は問題が発生した場合に試す価値があります。

ビルドプロセスが開始されると、IntelliJ IDEAの下部にある Build Output ウィンドウにビルドの進行状況や結果が表示されます。ビルドが成功すれば、「Artifact ‘‘ was built successfully」のようなメッセージが表示されます。ビルド中にエラーが発生した場合は、エラーメッセージととも詳細が表示されるので、それを確認して原因を特定し、Artifacts設定やプロジェクトのコードを修正します。

ビルドが成功したら、Artifacts設定で指定した Output Directory に指定した名前のJARファイル(および外部配置を選択した場合は依存ライブラリのJARファイル群)が生成されているはずです。

4. 作成したJARファイルのテスト

JARファイルが正常にビルドされたら、それが期待通りに機能するかをテストすることが重要です。テスト方法は、作成したJARがライブラリなのか、実行可能なアプリケーションなのかによって異なります。

4.1. ライブラリJARのテスト

作成したJARファイルが、他のプロジェクトで使用されるライブラリである場合、そのJARファイルを別のプロジェクトに依存関係として追加し、使用できるか確認します。

  1. 別のプロジェクトを開く: テスト用の新しいIntelliJ IDEAプロジェクトを作成するか、既存のプロジェクトを開きます。
  2. ライブラリとして追加:
    • テストプロジェクトの File -> Project Structure... を開きます。
    • Project Settings の下の Libraries を選択します。
    • + ボタンをクリックし、Java を選択します。
    • 作成したライブラリJARファイル、またはそのJARファイルを含むディレクトリを選択し、「OK」をクリックします。
    • このライブラリをどのモジュールで使用可能にするか尋ねられるので、適切なモジュールを選択します。
    • 「OK」をクリックしてライブラリをプロジェクトに追加し、「Project Structure」を閉じます。
  3. コードからの利用: テストプロジェクトのコード内で、作成したライブラリJARに含まれるクラスをimportして使用するコードを記述します。
  4. ビルドと実行: テストプロジェクトをビルドし、実行します。ライブラリが正しくクラスパスに追加されていれば、ライブラリ内のクラスを問題なく参照し、実行できるはずです。NoClassDefFoundErrorClassNotFoundException が発生する場合は、JARファイルにクラスが含まれていない、またはライブラリが正しくプロジェクトに追加されていない可能性があります。

4.2. 実行可能なJARのテスト

作成したJARファイルが単体で実行可能なアプリケーションである場合、コマンドラインから実行してテストします。

  1. コマンドプロンプト/ターミナルを開く: お使いのオペレーティングシステムのコマンドプロンプト(Windows)またはターミナル(macOS/Linux)を開きます。
  2. JARファイルが存在するディレクトリに移動: cd コマンドを使って、JARファイルが出力されたディレクトリに移動します。例えば、cd out/artifacts/MyApplication_executable_jar のようにします。
  3. JARファイルを実行: 以下のコマンドを実行します。

    bash
    java -jar your_jar_file_name.jar

    • your_jar_file_name.jar は、作成したJARファイルの実際のファイル名に置き換えてください。
  4. 実行結果の確認: アプリケーションが起動し、期待される動作をするか確認します。標準出力やエラー出力にメッセージが表示される場合は、それらも確認します。

注意点:

  • Java実行環境 (JRE/JDK): JARファイルを実行するには、システムにJava実行環境(JREまたはJDK)がインストールされている必要があります。java コマンドがパス通っているか確認してください。
  • 依存ライブラリ (外部配置の場合): Artifacts設定で copy to the output directory and link via manifest オプションを選択した場合、実行可能なJARファイルと同じディレクトリに依存ライブラリのJARファイル群も配置されている必要があります。java -jar コマンドは、デフォルトで実行しているJARと同じディレクトリにある Class-Path に指定されたライブラリを自動的にクラスパスに追加してくれます。もし依存ライブラリが別の場所にある場合は、手動でクラスパスを指定して実行する必要があるかもしれませんが、IntelliJ IDEAのArtifacts設定で外部配置を選択した場合、通常は同じディレクトリに配置されるためこの方法で実行できます。
  • Main-Class の指定: java -jar コマンドで実行するには、JARファイルの META-INF/MANIFEST.MF ファイルに Main-Class 属性が正しく指定されている必要があります。

4.3. 一般的な実行エラーとその対処法

実行可能なJARファイルをテストする際によく遭遇するエラーとその対処法は以下の通りです。

  • Error: Invalid or corrupt jarfile your_jar_file.jar: JARファイルが壊れているか、正しくビルドされていません。IntelliJ IDEAで Rebuild Artifact を試してください。または、ZIPツールでファイルを開けるか確認してみてください。
  • no main manifest attribute, in your_jar_file.jar: JARファイルの META-INF/MANIFEST.MF ファイルに Main-Class 属性が指定されていません。Artifacts設定の MANIFEST.MF 設定で、正しいメインクラスが指定されているか確認してください。
  • Error: Could not find or load main class com.example.myapp.ApplicationMain: MANIFEST.MFで指定されたメインクラスが見つかりません。
    • クラス名が正しいか(パッケージ名を含む完全修飾名か)確認してください。
    • そのクラスが実際にJARファイルに含まれているか(Artifacts設定のOutput Layoutでモジュール出力が含まれているか)確認してください。
    • クラスファイル名 (ApplicationMain.class) が大文字・小文字含め正しいか確認してください(特にLinuxなどの大文字・小文字を区別するファイルシステムの場合)。
  • Exception in thread "main" java.lang.NoClassDefFoundError: com/example/library/SomeClass: 実行時に特定のクラスが見つかりません。これは通常、依存ライブラリの問題です。
    • Fat JARでない場合 (copy to the output directory): 依存ライブラリのJARファイルが、実行しているメインJARファイルと同じディレクトリにあるか確認してください。MANIFEST.MFClass-Path属性に正しいファイル名がリストされているか確認してください。
    • Fat JARの場合 (extract to the target JAR): 依存ライブラリのクラスがメインJARファイルに正しく展開されているか確認してください。Artifacts設定のOutput Layoutで依存ライブラリが正しく含まれているか確認してください。複数のライブラリ間で同じクラス名が存在し、意図しないクラスがロードされている可能性も考えられます。
    • IntelliJ IDEAのArtifacts設定で、その依存ライブラリがArtifactに含まれる設定になっているか確認してください。
  • java.lang.ClassNotFoundException: com.example.library.SomeClass: NoClassDefFoundErrorと似ていますが、こちらはクラスローダーがクラスを見つけられなかった場合に発生します。原因と対処法はNoClassDefFoundErrorと同様です。
  • リソースファイルが見つからない (java.io.FileNotFoundException, java.lang.IllegalArgumentException: input == null など): JARファイル内のリソースファイル(設定ファイル、画像など)をロードしようとして失敗した場合。
    • リソースファイルがArtifacts設定のOutput LayoutでJARファイルに正しく含まれているか確認してください。
    • コード内でリソースファイルを参照するパスが、JARファイル内のパス構造と一致しているか確認してください。JAR内のリソースは、ファイルシステムパスではなく、ClassLoader.getResourceAsStream() のようなメソッドを使ってパスを指定してロードするのが標準的な方法です。

これらのエラーメッセージは、問題の原因を特定するための重要な手がかりとなります。メッセージを注意深く読み、Artifacts設定やプロジェクトの構造を見直してみてください。

5. Artifacts設定の詳細とカスタマイズ

IntelliJ IDEAのArtifacts機能は非常に柔軟で、様々なカスタマイズが可能です。ここでは、さらに踏み込んだ設定や、知っておくと便利な機能について解説します。

5.1. 複数のArtifactsの作成

一つのプロジェクトから、異なる目的の複数のJARファイルを作成したい場合があります。例えば、実行可能なアプリケーションJARと、そのアプリケーションが使用する共通ライブラリJARを分けたい、あるいはテスト用のJARと配布用のJARで構成を変えたいといったケースです。

これは、Project Structure -> Artifacts 画面で + ボタンを繰り返しクリックし、それぞれ異なる設定を持つArtifactを複数定義することで実現できます。各Artifactにはユニークな名前を付け、出力ディレクトリを分けるか、ファイル名で区別するように設定します。ビルド時にも Build -> Build Artifacts... メニューから、ビルドしたいArtifactを選択できます。

5.2. Artifacts間の依存関係

Artifacts機能にはArtifacts間の依存関係を設定する機能も存在しますが、JARファイルの場合はあまり一般的ではありません。主にWARやEARといった他のタイプのArtifactsで、コンポーネントのビルド順序を制御するために使用されます。JAR Artifactsでは、通常、プロジェクトモジュールやライブラリへの依存関係を適切に設定することが重要です。

5.3. Artifactsのインポート/エクスポート

作成したArtifactsの設定を、別のプロジェクトで再利用したい場合があります。IntelliJ IDEAでは、Artifactsの設定をXMLファイルとしてエクスポート/インポートする機能を提供しています。

  • Project Structure -> Artifacts 画面のツールバーにあるエクスポート/インポートアイコン(上下の矢印)をクリックして利用します。
  • これにより、複雑なArtifacts設定を手動で再構築する手間を省き、設定を簡単に共有できます。

5.4. 特定のファイルやディレクトリの除外

ArtifactのOutput Layoutを設定する際に、デフォルトで含まれる要素の中から特定のファイルやディレクトリを除外したい場合があります。例えば、モジュール出力には含まれるがJARには含めたくない設定ファイルやテスト用リソースなどです。

Output Layoutツリー内で、除外したいファイルやディレクトリを選択し、右クリックメニューから Exclude を選択することで除外できます。除外された要素はグレー表示になります。後で再度含めたい場合は、同様に右クリックメニューから Include を選択します。

5.5. ビルドオプション

Artifacts設定画面のArtifact名の下など、いくつかの場所にビルドに関する追加オプションが存在します。

  • Build on make: プロジェクトの make 実行時にArtifactもビルドするかどうか(前述の Include in project build と同じ設定)。
  • Compiler options: ターゲットJavaバージョンやエンコーディングなど、ビルドに使用するコンパイラに関する設定。これらの設定はプロジェクトやモジュールレベルの設定が優先される場合が多いですが、Artifact固有の設定を行うことも可能です。
  • JAR Manifest attributes: MANIFEST.MF に追加するカスタム属性をここで管理できます。

5.6. 署名付きJAR (Signed JAR) の作成

アプリケーションの信頼性を高めるために、JARファイルにデジタル署名を施すことがあります。IntelliJ IDEAのArtifacts機能は、JAR作成と同時に署名を行う設定をサポートしています。

Project Structure -> Artifacts 画面でJAR Artifactを選択し、右側の詳細設定ペインの下部にある Signing セクションを設定します。

  • Sign the JAR: チェックボックスをオンにします。
  • Keystore file: 署名に使用するキーストアファイル(通常 .jks 拡張子)のパスを指定します。
  • Keystore password: キーストアのパスワードを入力します。
  • Key alias: キーストア内で署名に使用する秘密鍵のエイリアス名を指定します。
  • Key password: 秘密鍵のパスワードを入力します(キーストアパスワードと同じである場合が多い)。

これらの設定を行うことで、Artifactをビルドする際に指定されたキーストアと秘密鍵を使用して自動的にJARファイルに署名が施されます。

6. Maven/GradleでのJAR作成とIntelliJ IDEA

現代のJava開発では、MavenやGradleといったビルドツールを使用することが一般的です。これらのビルドツールを使う場合、JAR作成はビルドツールの設定ファイル (pom.xml または build.gradle) に記述され、IntelliJ IDEAはそれらの設定に基づいてビルドを実行するインターフェースとして機能します。

6.1. ビルドツールを使う利点

ビルドツールを使う主な利点は以下の通りです。

  • 標準化: ビルドプロセスがプロジェクトファイルに記述されるため、どの開発環境でも同じ方法でビルドできます。
  • 依存関係管理: 依存ライブラリのダウンロード、解決、管理を自動で行ってくれます。
  • 自動化: テストの実行、コンパイル、パッケージング(JAR作成)、デプロイといった一連のビルドプロセスを自動化できます。
  • 豊富なプラグイン: 様々な追加機能をプラグインとして利用できます(コード品質分析、静的解析、各種ファイル生成など)。

6.2. MavenでのJAR作成

Mavenプロジェクトでは、JAR作成は主に以下のプラグインによって制御されます。

  • maven-jar-plugin: 標準的なJARファイルを作成します。pom.xml<build> セクションで設定します。実行可能なJARにするための Main-Class の指定や、Class-Path の自動生成などの設定が可能です。
  • maven-assembly-plugin: 依存ライブラリを含んだFat JARを作成する際によく使われます。特定のプロファイル(例: jar-with-dependencies)を使ってアセンブリ(パッケージング)の設定を記述します。

pom.xml の設定例(実行可能なJAR、依存ライブラリを外部に配置):

xml
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath> <!-- Class-Path属性を自動生成 -->
<classpathPrefix>lib/</classpathPrefix> <!-- Class-Pathのプレフィックス -->
<mainClass>com.example.myapp.ApplicationMain</mainClass> <!-- メインクラス指定 -->
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase> <!-- packageフェーズで実行 -->
<goals>
<goal>copy-dependencies</goal> <!-- 依存ライブラリをコピー -->
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- コピー先ディレクトリ -->
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>

この設定では、maven-jar-plugin がメインクラスを指定したJARを生成し、maven-dependency-plugin が依存ライブラリを target/lib ディレクトリにコピーします。maven-jar-pluginaddClasspath>true</addClasspath>classpathPrefix>lib/</classpathPrefix> の設定により、MANIFEST.MFClass-Path: lib/dependency1.jar lib/dependency2.jar ... のようなエントリを自動的に追加します。

IntelliJ IDEAでの実行:

IntelliJ IDEAでMavenプロジェクトを開くと、右側または下部に Maven ツールウィンドウが表示されます。このツールウィンドウから、定義済みのライフサイクルフェーズ(clean, compile, package, installなど)やプラグインゴールを実行できます。

  • JARを作成するには、通常 package フェーズを実行します。package をダブルクリックするか、右クリックして Run Maven を選択します。
  • ビルドが成功すると、プロジェクトの target ディレクトリにJARファイル(および依存ライブラリ)が生成されます。

6.3. GradleでのJAR作成

Gradleプロジェクトでは、JAR作成は標準の jar タスクによって行われます。build.gradle ファイルで設定します。Fat JARを作成する場合は、shadowJar プラグインなどがよく使われます。

build.gradle の設定例(実行可能なJAR、依存ライブラリをFat JARとして内包):

“`gradle
plugins {
id ‘java’
id ‘com.github.johnrengelman.shadow’ version ‘7.1.2’ // shadowJarプラグイン
}

// 標準のjarタスクの設定
jar {
manifest {
attributes ‘Main-Class’: ‘com.example.myapp.ApplicationMain’ // メインクラス指定
}
}

// shadowJarタスクの設定 (Fat JAR)
shadowJar {
// 標準のjarタスク設定をshadowJarタスクにも適用
manifest {
attributes ‘Main-Class’: ‘com.example.myapp.ApplicationMain’ // メインクラス指定
}
// 依存ライブラリを含める設定 (デフォルトで含まれる)
// from sourceSets.main.output
// configurations = [project.configurations.runtimeClasspath]
}

// ビルド成果物の名前などを設定 (オプション)
tasks.withType(Jar) {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

// Fat JARをデフォルトのビルド成果物とする場合 (オプション)
// tasks.build {
// dependsOn shadowJar
// }
“`

この設定では、標準の jar タスクで自作コードのみを含むJARを作成し、shadowJar タスクで依存ライブラリを含んだFat JARを作成します。shadowJar プラグインは、デフォルトで依存ライブラリをJAR内に内包し、MANIFEST.MF を適切に設定してくれます。

IntelliJ IDEAでの実行:

IntelliJ IDEAでGradleプロジェクトを開くと、右側または下部に Gradle ツールウィンドウが表示されます。このツールウィンドウから、定義済みのタスクを実行できます。

  • 標準のJARを作成するには jar タスクを、Fat JARを作成するには shadowJar タスクを実行します。各タスクをダブルクリックするか、右クリックして Run Task を選択します。
  • ビルドが成功すると、通常 build/libs ディレクトリにJARファイルが生成されます。

6.4. Artifactsとビルドツールの使い分け

Maven/Gradleを使っているプロジェクトでは、基本的にはビルドツールの設定 (pom.xml/build.gradle) を使ってJARを作成するのが最も推奨される方法です。これにより、プロジェクトのビルドプロセスが一元管理され、再現性が高まります。

一方で、IntelliJ IDEAのArtifacts機能も以下の点で有用です。

  • ビルドツールを使っていないプロジェクト: MavenやGradleを使用していないプロジェクトで手軽にJARを作成するのに最適です。
  • カスタムビルド: ビルドツールの標準的な出力とは異なる、特定の構成を持つJARを一時的に作成したい場合や、開発中に素早く特定のファイルだけをJAR化してテストしたい場合などに便利です。ビルドツールの設定を変更するよりもArtifactsで設定する方が手軽なことがあります。
  • IDE独自の機能を利用: 例えば、IntelliJ IDEAのデバッグ機能で作成したJARを実行するRun Configurationを設定する場合など、IDEとの連携がスムーズな場合があります。

しかし、チーム開発や自動化されたビルドシステム(CI/CD)を前提とする場合は、ビルドツールによるJAR作成を標準とするべきです。Artifactsの設定はIDEの設定ファイルに保存されるため、他の開発者やビルドサーバーと共有しにくいという側面があります。

7. よくある問題とトラブルシューティング

これまで解説した内容を踏まえ、JAR作成や実行時によく発生する問題と、その一般的なトラブルシューティング方法をまとめます。

  • ビルドが成功するのにJARが出力ディレクトリにない:
    • Artifacts設定の Output Directory が正しいか確認してください。
    • ビルドを実行したArtifactが、目的のArtifactと一致しているか確認してください。
    • 出力ディレクトリへの書き込み権限があるか確認してください。
  • 実行可能なJARがダブルクリックで起動しない(Windows):
    • これはOS側の関連付けの問題である可能性が高いです。java -jar your_jar_file.jar のようにコマンドラインから実行できるか試してください。コマンドラインから実行できる場合はJARファイル自体は問題ありません。JARファイルの関連付けを修正するか、ラッパーEXEを作成するなどの対応が必要です。
  • META-INF/MANIFEST.MF がJARに含まれていない、または内容がおかしい:
    • Artifacts設定のOutput Layoutで、META-INF ディレクトリの下に MANIFEST.MF が正しく配置されているか確認してください。
    • MANIFEST.MF の設定(Main Classなど)が正しいか確認してください。
    • 手動で MANIFEST.MF を作成して含める場合、ファイルの内容が正しいフォーマット(最後の行は必ず改行で終わるなど)になっているか確認してください。
  • 依存関係の競合: Fat JARを作成した場合に、異なる依存ライブラリが同じ名前のクラスを含んでおり、予期しないクラスがロードされることでエラーが発生することがあります。
    • NoClassDefFoundErrorClassNotFoundException が特定のクラスで発生する場合、そのクラスが複数のJARに含まれていないか確認してください。
    • Mavenであれば mvn dependency:tree、Gradleであれば gradle dependencies コマンドを使って依存関係ツリーを確認し、どのライブラリがそのクラスを提供しているか調査します。
    • extract to the target JAR ではなく copy to the output directory and link via manifest を使用するか、ビルドツールの依存関係除外機能を使って不要な依存クラスを含めないようにします。
  • リソースファイルが見つからない: コードから Class.getResourceAsStream() などでリソースファイルにアクセスできない場合。
    • Artifacts設定のOutput Layoutで、リソースファイルがJAR内の正しいパスに配置されているか確認してください。通常、リソースファイルはソースファイルと同じパッケージ構造で配置されるか、JARのルートや特定のディレクトリ(例: /resources)に配置されます。
    • コード内でリソースパスを指定する際、スラッシュ (/) で始まるパスはクラスパスのルートからの相対パスとなります。パッケージ内のリソースは、パッケージ名を含めたパスで指定します(例: /com/example/myapp/config.properties)。クラスからの相対パスの場合はスラッシュで始めません。
  • ビルドが遅い、IntelliJ IDEAが重い:
    • IntelliJ IDEAのキャッシュが原因である可能性があります。File -> Invalidate Caches / Restart... を試してみてください。
    • プロジェクトやArtifacts設定が複雑すぎる場合、ビルドに時間がかかることがあります。

これらの問題が発生した場合は、まずエラーメッセージを注意深く読み、そのメッセージが示唆する箇所(MANIFEST.MF、特定のクラス、ファイルパスなど)をArtifacts設定やコード内で確認することが重要です。

8. まとめと次のステップ

この記事では、IntelliJ IDEAを使用してJARファイルを作成するための詳細な手順と関連知識を網羅的に解説しました。JARファイルの基本的な構造から始まり、IntelliJ IDEAのArtifacts機能を使った設定方法、ビルド、テスト、そしてよくある問題とその対処法まで、幅広くカバーしました。さらに、MavenやGradleといったビルドツールを使ったJAR作成の概要と、IntelliJ IDEAとの連携についても触れました。

IntelliJ IDEAのArtifacts機能は、直感的で強力なJAR作成手段を提供します。特に、ビルドツールを使っていないプロジェクトや、カスタムJARを素早く作成したい場合にその威力を発揮します。一方、標準的なビルドプロセスやチーム開発においては、MavenやGradleのようなビルドツールを利用するのがより堅牢で推奨されるアプローチです。IntelliJ IDEAはどちらの方法も強力にサポートしており、開発者のニーズに合わせて最適な方法を選択できます。

この記事が、あなたのJavaプロジェクトから目的のJARファイルを正確かつ効率的に作成するための完全なガイドとなることを願っています。

次のステップとして、以下のことに挑戦してみるのも良いでしょう。

  • 今回作成した実行可能なJARファイルに、コマンドライン引数を受け取る機能を追加してみる。
  • ライブラリJARを作成し、別のプロジェクトでそれを依存関係として使用してみる。
  • プロジェクトでMavenやGradleを使っている場合は、ビルドツールを使ったJAR作成の設定(pom.xmlbuild.gradle)を確認し、Artifacts設定と比較してみる。
  • 可能であれば、作成したJARファイルにデジタル署名を施してみる。
  • CI/CD環境でMavenやGradleを使ってJARファイルを自動的にビルドするパイプラインを構築してみる。

ソフトウェア開発は常に進化しています。新しいJavaのバージョン、ビルドツールのアップデート、IntelliJ IDEAの新機能なども登場しますので、常に最新の情報に触れながら、ご自身の開発スキルを磨いていってください。

この記事があなたの開発の一助となれば幸いです。最後までお読みいただき、ありがとうございました。もし質問やさらに知りたい点があれば、お気軽にお尋ねください。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール