IntelliJ 使い方 ~JARファイルを出力する~

IntelliJでJARファイルを出力する

Javaでプログラムを作成していると、最終的に配布できるようにしたくなるものです。
作ったモノを配布するには、作成物を「起動ファイル」に変換して配布するパターンが多いです。
C/C++などでは「*.exe」ファイルを出力します。このようなダブルクリックで起動できるファイルのことを
実行可能ファイル(Wiki参照)と呼びます。

でわ、Javaの場合はどうでしょうか?主にJARファイル、WARファイル、EARファイルなどがあります。
WARとかEARファイルは、ウェブアプリケーションとして、デプロイ(Tomcatなどのサーバー上に配置)して起動します。

Githubとの連携方法は下の動画を参照ください。

JARファイルは?

JARファイルは、どちらかというとローカル(自分のPC)上で動かすための起動ファイルです。
「java -jar ファイル名(パス付き)」コマンドで実行することができます。

外国のものばかりのサイトですが、このようなアプリがあるようです。

JAR出力

IntelliJでJARの出力をするときは以下のような手順でやるようです。

  1. File -> ProjectStructureを選択

  2. Airtifactsを選択

  3. 「+」ボタンを押下、JAR -> From module with dependenciesを選択

  4. 起動するメインメソッドのあるクラスを指定

  5. 下のように、出力するファイルを一覧できるので、確認、OKボタンを押下

  6. 上部にある「Build」 -> 「Build Artifact」を選択

指定のフォルダにJARファイルが出力されます。

出力したJARを動かす

下のように動画にしました。

コマンド実行

JARファイルをコマンドで動かすのにJavaプログラミングの記事ではあまり見かけませんが、プログラム引数を使用したいと考えています。

よくある使用方法。

  1. 起動するときにオプションを付けて実行する
  2. 実行するときの設定ファイルを変更する

考えればいくらでも出てくるのでこのくらいにしますが、今回は2の「実行するときの設定ファイルを変更する」を実装することを考えたいと思います。

ビルドパスについて

ファイルやクラスを参照するために設定するのが、ビルドパスです。大体はプロジェクトのルートにせってしてあります。
なので、ファイルを参照するときはプロジェクト直下から記述します。
下の図は、作成しているプロジェクトのフォルダです。

ちなみに、IntelliJ IDEAで開くと下のような画面です。

ここからJARファイルを参照したければ「ObjectOrientedPrograming.jar」と書いてやれば参照できます。
具体的には、下のようなコードです。

File jarFile = Files.newBufferedReader(Paths.get("ObjectOrientedPrograming.jar"));

では、上のプロジェクトのようなフォルダ構成の場合、resourcesフォルダ内の「SampleRpg_story.txt」を参照したいとしましょう。この場合は、「resources/SampleRpg_story.txt」を参照すればよいです。
プログラムで書くと下のようになります。

File jarFile = Files.newBufferedReader(Paths.get("resources", "SampleRpg_story.txt"));

この場合は、フォルダを第一引数("resources")フォルダを指定します。同様にSample_story.txtを参照します。

ちょっとわかりずらいので、下の図に示します。

これを参照するときは、「src/main/resources/Sample_story.txt」とパスを指定してやればOKです。
プログラムで書くと下のようになります。

File jarFile = Files.newBufferedReader(Paths.get("src/main/resources", "SampleRpg_story.txt"));

初めの問題

JARファイルで起動したときに、パスの指定がどのようになるのか?というところを
明確にしたいというところです。

ためにしにJARファイルを作成して実行してみたところ。。。
JARファイルのある場所から普通にファイルの参照ができました。つまりJARファイルのある場所からパスを指定してやれば、対象のファイルを参照できるということがわかりました。

具体的には、下のようなコードです。

    public static void main(String[] args) {
        System.out.println("Param: " + args[0]);
        BufferedReader buf = null;
        try {
            if (args.length != 0) {
                buf = Files.newBufferedReader(Paths.get(args[0]));
            }
            RpgLogic gameLogic = new TextRpgLogic();
            TextRpgGameEngine engine  = new TextRpgGameEngine(gameLogic);

            engine.start();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("想定外のエラーで終了します。:" + e.getMessage());
            System.exit(-1);
        }
    }

実行結果はこちらです。

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す