ソフトウェアエンジニアの雑記

日々思ったことをまとめます

Javaをスクリプト言語っぽくするJBangその5(CLIツールを作成する、テンプレート機能)

Javaスクリプト言語っぽくするJBangその5です。CLIツールの作成とテンプレート機能を説明します。CLIとかでJavaを使う選択肢はあんまりないかなと思いますが、結構簡単につくれてしまうのでJavaが動く環境であれば選択肢に入れていいかと思います。

k-sasaki.net

k-sasaki.net

k-sasaki.net

k-sasaki.net

テンプレートからCLIを作成

JBangではテンプレートからCLIがすぐに制作できるようにプリセットされています。下記のコマンド投入で

jbang init --template=cli cli/CliSample.java

下記のJavaコードが出力されます。

///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS info.picocli:picocli:4.6.3


import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;

import java.util.concurrent.Callable;

@Command(name = "CliSample", mixinStandardHelpOptions = true, version = "CliSample 0.1",
        description = "CliSample made with jbang")
class CliSample implements Callable<Integer> {

    @Parameters(index = "0", description = "The greeting to print", defaultValue = "World!")
    private String greeting;

    public static void main(String... args) {
        int exitCode = new CommandLine(new CliSample()).execute(args);
        System.exit(exitCode);
    }

    @Override
    public Integer call() throws Exception { // your business logic goes here...
        System.out.println("Hello " + greeting);
        return 0;
    }
}

中身を見てみると、//DEPSPicoCLIが設定されています。実行してみましょう。

$ jbang cli/CliSample.java CLI
Hello CLI

プロジェクト内で必要なコマンドとかは簡単に作れそうですね。

templateコマンド

JBangにはtemplateコマンドがあります。プリセットされているものも含めて一覧にするコマンドがあるので、実行してみます。

$ jbang template list
agent
   Agent template
cli
   CLI template
gpt
   Template using ChatGPT (requires --preview and OPENAI_API_KEY)
gpt.groovy
   Template using ChatGPT for groovy (requires --preview and OPENAI_API_KEY)
gpt.kt
   Template using ChatGPT for kotlin (requires --preview and OPENAI_API_KEY)
hello
   Basic Hello World template
hello.groovy
   Basic groovy Hello World template
hello.kt
   Basic kotlin Hello World template
jbang-catalog
   Template for creating a new JBang catalog hosted on github with automatic renovate updates
qcli
   Quarkus CLI template
qmetrics
   Quarkus Metrics template
qrest
   Quarkus REST template
readme.md
   Basic markdown readme template

プリセットされているものだけでも、魅力的なものがたくさんあります。QuarkusのRESTAPIやCLIだったり、ChatGPTのAPIクライアントを生成できるようです。

JBangのtemplateに追加する

その3で作成したJBangアプリケーションをテンプレート化してみましょう。

$ jbang template add --name SpringBootTemplate --description SpringBootSampleApp api/SpringBootSample.java api/application.yml

[jbang] No explicit target pattern was set, using first file: {basename}.java=api/SpringBootSample.java
[jbang] Template 'SpringBootTemplate' added to '/Users/kohei.sasaki/.jbang/jbang-catalog.json'

テンプレートに名前をつけて、テンプレート化したいファイルをスペース区切りで入力します。説明文もつけてみました。作成した情報は、jbang-catalog.jsonの中に入ります。

{
  ...
  ,"templates": {
    "SpringBootTemplate": {
      "file-refs": {
        "{basename}.java": "../git/jbang-sample/api/SpringBootSample.java",
        "application.yml": "../git/jbang-sample/api/application.yml"
      },
      "description": "SpringBootSampleApp",
      "properties": {}
    }
}

登録されていますね。テンプレート一覧をみて、確認してみます。

$ jbang template list
SpringBootTemplate
   SpringBootSampleApp

追加されていました。テンプレートに追加したものでJBang initをしてみます。

jbang init --tempalte SpringBootTemplate template/SpringBootSample.java

tree template
template
├── SpringBootSample.java
└── application.yml

無事作成されています。これで、チーム内ルールがコード化されているので、ちょっとしたツールとかもカジュアルに生産性高く作れそうです。

まとめ

JBang templateの使用方法を説明してみました。生成されるコードはJavaコードがほとんどですが、コマンド、実行などスクリプト言語っぽく使え、チーム開発でも活用できそうです。ぜひ使ってみてください。