知り合いの Java 開発者が、コマンドラインで使う CLI tool は開発したことがない、と言っていました。なのでその知り合いのため、Java 用に簡単なテンプレートを作成してみました。
他の方にあまり参考にはならないとおもいますが、いちおう公開しておきますね。GitHub リポジトリは yamachan/CLIToolBase です。
環境
環境は以前に 投稿した 時からあまり更新しておらず。
開発環境はレトロな Eclipse IDE 2020-09 for Enterprise Java Developers です。
プロジェクトの新規作成
ファイルの New メニューから Java Prokect を新規作成します。
Project Name を適当に入力 (今回は CLIToolBase) して Finish で終了。
Package Explorer に作成したパッケージが表示されていればok。
git init しておく
まだ空のプロジェクトですが、いったん git init を実行して初期化しておきます。
この空の状態を first commit として push しておきました。
main 関数を作成
さて、まずは最初に実行されるクラスを新規作成します。
適当なクラス名 (今回は CLIMain) を指定し、main 関数の生成をチェックして Finish。
以下のような感じで生成されますね。
とりあえず、定番の1行を追加してみましょう。
変更を保存したら、クラスファイルを右クリックして Run As Java Application
です。
コンソールに Hello World.
が表示されればok。
ついでに簡単な README.md ファイルを追加して push してみました。
Apache Commons CLI の導入
CLI tool を書く場合は必須ともいえる Apache Commons CLI を導入します。
ちょっと原始的ですが mvnrepository などから好みのバージョンをダウンロードします。私は新しめの commons-cli-1.5.0.jar ファイルをダウンロードしました。ダウンロード先はどこでも良い気はしますが、今回はプロジェクト内に lib
フォルダを作成して、配置しています。
そして Build Path
メニューにある Configure Build Path...
メニューから
Add JARs...
メニューから、配置した jar ファイルを追加します。
こんな感じに追加されていればok。Apply and Close
で閉じましょう。
動作確認
Using Apache Commons CLI にあるサンプルコードを適当にコピーして動作確認してみます。
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLIMain {
public static void main(String[] args) throws ParseException {
// create Options object
Options options = new Options();
// add t option
options.addOption("t", false, "display current time");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);
if(cmd.hasOption("t")) {
System.out.println("Sample output with t option.");
} else {
System.out.println("Sample output without t option.");
}
}
}
このコードを単に実行すると else 文のほうのメッセージが表示されます。
実行の Run Configuration...
から、
パラメータ部分に -t
オプションを指定して実行すると、
if文の cmd.hasOption("t")
が成立して、表示メッセージが変わることが確認できます。
この変更も push してみました。
長いオプション名も有効にする
-t
に加えて --time
という長いオプション名を使えると良いですよね。むろん今は実行エラーになります。
指定できるようにするには、以下のように変更します。
// add t option
options.addOption("t", "time", false, "display current time");
メッセージも少し修正したものを push しましたので、参照してみてください。
Help メッセージの生成
commons-cli ライブラリで私が一番好きなのは、ヘルプメッセージの生成が楽になるところです。サンプルを以下のように拡張してみました。
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLIMain {
public static String version = "1.0.0";
public static String update = "2023/05/07";
public static void main(String[] args) throws ParseException {
// create Options object
Options options = new Options();
// add options
options.addOption("t", "time", false, "display current time");
options.addOption("h", "help", false, "display help message");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);
if(cmd.hasOption("h")) {
HelpFormatter hf = new HelpFormatter();
hf.printHelp("CLIToolBase", "A simple template repo for Java CLI tool.", options, "\nversion " + version + " at " + update, true);
System.exit(0);
} else if (cmd.hasOption("t")) {
System.out.println("Sample output with [-t|--time] option.");
} else {
System.out.println("Sample output without [-t|--time] option.");
}
}
}
差分は push したものを参照したほうが良いかもしれません。
で、-h
もしくは --help
オプションを指定して実行すると、以下のようなヘルプメッセージが表示されます。
パラメータ一覧の部分が自動生成なのがポイントです。
ツールを配布する
作成したツールは jar 形式にまとめて利用者に配布しましょう。まず Run Configurations
のパラメータ指定はいったん消しましょう。
プロジェクトを右クリックして Export...
を実行。
Runable JAR file
を選んで Next。
Launch configuration
には Run Configurations
と同じものを指定します。 Export destination
で配布用の jar ファイル名を指定します。
Library handling
は真ん中の選択肢をお勧めします。生成された jar の中に、実行に必要なライブラリもそのまま含まれるので、便利かつ楽です。
※ 利用するライブラリのサイズが大きくて配布が面倒な場合は一番下を選んでファイルを分けましょう
Finish で jar ファイルが生成されますので、利用者に配布しましょう。jar ファイルを受け取った側は、以下のように実行できます。
というわけで
非常に初歩的な内容となりましたが、Java で CLI tool を書いてみる際の簡易テンプレートを作成し、ざっくり説明してみました。commons-cli ライブラリを使うと、CLI tool の UI 作成部分が非常に楽なので、自分に便利なものを量産すると良いとおもいますよ。
ではでは。