見出し画像

Quarkusでコマンドラインアプリを作る - 導入篇

遡ること数か月前、Twitterで、QuarkusがCommand modeに対応したことを知った。
記事はこれ。

QuarkusはJavaでWebアプリのバックエンドを書くときには個人的には一押しで、できることならSpringやJerseyではなくてQuarkusを使うことを勧めたいと思ってる。
ただ、ある面当然なのだけど、Javaを書く局面はWebアプリの時ばかりではなくて、バッチ処理を書くこともそう少ない頻度である。

リリースのアナウンスがあったのはv1.4で現在はv1.6、期間にして3か月遅れだけど、
バッチに使うことも検討できる、かもしれないQuarkusの実力を見定めるための第一歩として、まずは最低限のものを書いて遊んでみた。実用的なことは何もしてない。

上記などを参考に、quarkus.ioで Start Codingからパッケージを作り、追加のパッケージは何も選択せずにGenerate。
それから、初期で用意されていたResourceクラスとそれに紐づくテストクラスを2つ削除し、今回のコマンドライン用のMainクラスとServiceクラスを作成。

はじめ、コマンドモードのGetting Startedのリポジトリがあるのを知らず、ブログからはServiceクラスが見えないし、次のようにも書かれているので、QuarkusのGitHubのリポジトリの無印のGetting StartedのServiceクラスを確認しに行ってしまった。

Below is a simple GreetingMain class which uses the traditional GreetingService from all our quickstarts.

それから、初めからGitHubのリポジトリを見に行っている人には関係ないけど、Quarkusのブログに貼ってあるコード片にはコピペミスなのか、脱字があるので切り貼りだけでは動かないので注意。(あるあるだけど、argsであるべきところがargになっていたっていうやつ)


で、出来上がったものを見ると、こんな感じ。
tkhmって渡すと、"hi tkhm"って返してくれるシンプルなやつ。

$ java -jar quarkus-command-1.0.0-SNAPSHOT-runner.jar tkhm
__  ____  __  _____   ___  __ ____  ______ 
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2020-08-09 22:21:30,188 INFO  [io.quarkus] (main) quarkus-command 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.6.1.Final) started in 1.085s. Listening on: http://0.0.0.0:8080
2020-08-09 22:21:30,234 INFO  [io.quarkus] (main) Profile prod activated. 
2020-08-09 22:21:30,234 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]
hi tkhm
2020-08-09 22:21:30,331 INFO  [io.quarkus] (main) quarkus-command stopped in 0.064s

で、ここで見てて気持ち悪いのが、コマンドモード(CLI)のつもりでいるのに、8080ポートで待っていること。
これについてはブログにも言及があって、いらないならresteasyをarcに変えて、と書いてあった。

なので、build.gradleのdependencyを次のように置き換えた。

   // implementation 'io.quarkus:quarkus-resteasy'
   implementation 'io.quarkus:quarkus-arc'

置き換え後は確かに8080で待ってる旨が出力されなくなった。

$ java -jar build/quarkus-command-1.0.0-SNAPSHOT-runner.jar tkhm
__  ____  __  _____   ___  __ ____  ______ 
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2020-08-09 22:24:51,794 INFO  [io.quarkus] (main) quarkus-command 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.6.1.Final) started in 0.422s. 
2020-08-09 22:24:51,834 INFO  [io.quarkus] (main) Profile prod activated. 
2020-08-09 22:24:51,835 INFO  [io.quarkus] (main) Installed features: [cdi]
hi tkhm
2020-08-09 22:24:51,873 INFO  [io.quarkus] (main) quarkus-command stopped in 0.012s


で、これを触ってながら気づいたのが、QurakusがExtensionのサポートとして、picocliというライブラリに対応しているということ。

サクッと見た感じ、コマンドで受け付けるオプションとかの定義が楽そうだったので、コマンドモードを使うならこれも視野に入れたほうがいいのかも。


今回簡単に触ったやつはGitHubに置いてある。
Quarkusの例が基本的に全てMavenなのが辛い。Gradleが好きです......。

posted on: https://blog.tkhm.dev/2020/08/quarkus.html