IntelliJでJARファイルを出力する
Javaでプログラムを作成していると、最終的に配布できるようにしたくなるものです。
作ったモノを配布するには、作成物を「起動ファイル」に変換して配布するパターンが多いです。
C/C++などでは「*.exe」ファイルを出力します。このようなダブルクリックで起動できるファイルのことを
実行可能ファイル(Wiki参照)と呼びます。
でわ、Javaの場合はどうでしょうか?主にJARファイル、WARファイル、EARファイルなどがあります。
WARとかEARファイルは、ウェブアプリケーションとして、デプロイ(Tomcatなどのサーバー上に配置)して起動します。
Githubとの連携方法は下の動画を参照ください。
JARファイルは?
JARファイルは、どちらかというとローカル(自分のPC)上で動かすための起動ファイルです。
「java -jar ファイル名(パス付き)」コマンドで実行することができます。
外国のものばかりのサイトですが、このようなアプリがあるようです。
JAR出力
IntelliJでJARの出力をするときは以下のような手順でやるようです。
-
File -> ProjectStructureを選択
-
Airtifactsを選択
-
「+」ボタンを押下、JAR -> From module with dependenciesを選択
-
起動するメインメソッドのあるクラスを指定
-
下のように、出力するファイルを一覧できるので、確認、OKボタンを押下
-
上部にある「Build」 -> 「Build Artifact」を選択
指定のフォルダにJARファイルが出力されます。
出力したJARを動かす
下のように動画にしました。
コマンド実行
JARファイルをコマンドで動かすのにJavaプログラミングの記事ではあまり見かけませんが、プログラム引数を使用したいと考えています。
よくある使用方法。
- 起動するときにオプションを付けて実行する
- 実行するときの設定ファイルを変更する
考えればいくらでも出てくるのでこのくらいにしますが、今回は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);
}
}
実行結果はこちらです。