JBangは、JShellと同じように、Javaコードをスクリプトとして実行する手段を提供する。しかしながら、JShellとは違い、JBangはJava 8に対応しており、依存関係ライブラリを自動的にダウンロードして使用することができる。事実としてJBangは、Javaをインストールしなくても実行することができる -- 必要であれば、適切なJVMが単にダウンロードされるのだ。
JBangはbashとpowershellで記述された起動スクリプトで、JVMを検出ないしダウンロードした上で、指定した引数でJavaスクリプトを(ダウン)ロードする機能を持つ。JBangの実装部分はJava JARアーカイブになっており、これが他のコマンドをローンチする。
JBangはjshまたはjavaファイルを実行することができる。後者はmain()
メソッドを持った標準的なJavaクラスである。ただし、JShellとは違い、先頭に記述したコメントで依存関係を自動的にダウンロードして、クラスパスを設定することが可能になっている。JShellでは起動時にJARをクラスパスに加えることが可能だが、(再帰的な)依存関係は手作業で追加する必要がある。
例として、jfiglef(GPL)を依存関係として使用し、大きなテキストを表示するJavaアプリケーションを実行するには、JBangで以下のようなスクリプトを起動すればよい。
//usr/bin/env jbang "$0" "$@" ; exit $? //DEPS com.github.lalyos:jfiglet:0.0.8 import com.github.lalyos.jfiglet.FigletFont; class hello { public static void main(String... args) throws Exception { System.out.println(FigletFont.convertOneLine("Hello InfoQ"); } }
sdkmanでjbangをインストールするか、あるいはダウンロードした後に"jbang run hello.java InfoQ
"を実行すれば、次のように表示される。
_ _ _ _ ___ __ ___ | | | | ___ | | | | ___ |_ _| _ __ / _| ___ / _ \ | |_| | / _ \ | | | | / _ \ | | | '_ \ | |_ / _ \ | | | | | _ | | __/ | | | | | (_) | | | | | | | | _| | (_) | | |_| | |_| |_| \___| |_| |_| \___/ |___| |_| |_| |_| \___/ \__\_\
JBangを使用するメリットは、ファイル先頭にある//DEPS
コメントに基づいた依存関係が、jcenterリポジトリからダウンロードされることだ。再帰的な依存関係もフォローして、実行に必要なものはすべてクラスパス上にあることが保証される。これにより、もっと複雑なアプリケーションも、コマンドラインからスクリプト実行することが可能になる。さらに依存関係は、GitHubリポジトリへの直接的なリンクとして、ブランチあるいはタグ指定されたリリースで指定することもできる。内部使用のために、"//REPOS mavenCentral,artifactory=https://example.com/repository
"のように、//REPOS
コメントを使用して別のリポジトリを指定することが可能になっている。
複数バージョンのJavaがサポートされており、//JAVA8
あるいは//JAVA11+
というコメントを使用して、Java 8あるいはJava 11以降を使用するように厳密に指定することが可能である。JVMはコマンド起動時に、オペレーティングシステム用のものがAdoptOpenJDKサイトからダウンロードされる。注目すべきなのは、jbang
スクリプトには--javaオプションがあり、指定したバージョンを使ってスクリプトを実行することが可能であるため、Java 11、14、15などでのアプリケーションのテストが非常に簡単にできることだ。"jbang run --java 11 hello.java
"、あるいは"jbang run --java 14 hello.java
"を実行して、同じスクリプトをそれぞれのJVMバージョンで実行することができる。
コードをリモートソースからダウンロードすることが可能なので、スクリプトをチェックアウトすることさえ不要だ。上記の例であれば、単にスクリプトを含むURLを指示すれば実行できる。
$ jbang run --java 15 https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ _ _ _ _ ___ __ ___ | | | | ___ | | | | ___ |_ _| _ __ / _| ___ / _ \ | |_| | / _ \ | | | | / _ \ | | | '_ \ | |_ / _ \ | | | | | _ | | __/ | | | | | (_) | | | | | | | | _| | (_) | | |_| | |_| |_| \___| |_| |_| \___/ |___| |_| |_| |_| \___/ \__\_\
最後に、jbang
には起動スクリプト(BashスクリプトおよびPowerShellスクリプト)が用意されているので、jbang
をインストールしなくても実行することができる。
$ curl -Ls https://sh.jbang.dev | bash -s — https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ PS C:> iex "& { $(iwr https://ps.jbang.dev) } https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ
jbangに関する詳細な情報は、ホームページであるhttps://jbang.devか、GitHubリポジトリhttps://github.com/jbangdev/jbangを参照してほしい。