JBangのその2です。依存関係や複数ファイルでの実行などその1
より少し大きいコードを書いていこうとおもいます。
インストールや基本的な設定はその1
をみてください。
k-sasaki.net
成果物
本日のコードは下記のようになります。内容は、PlayWright for Java
のライブラリを使用して、引数で入力したURLのスクリーンショットを取得するコードになります。これもサクっとできちゃうので、JBangのいいところです。
1つ1つ解説していきます。
Sample.Java
///usr/bin/env jbang "$0" "$@" ; exit $? //SOURCES ScreenShotService.java //FILES application.yml //REPOS central,jitpack,google import java.util.Scanner; public class Sample { public static void main(String... args) { System.out.println("starting playwright. please input url."); Scanner scanner = new Scanner(System.in); // 標準入力待ち状態にする String inputUrl = scanner.next(); // 標準入力を取り出す new ScreenShotService().takeScreenShot(inputUrl); } }
今回は、説明のためにもう1ファイル追加します。
ScreenShotService.java
//DEPS com.microsoft.playwright:playwright:1.52.0 import java.nio.file.Paths; import com.microsoft.playwright.Page; import com.microsoft.playwright.Playwright; import com.microsoft.playwright.Response; public class ScreenShotService { public void takeScreenShot(String url) { try (Playwright playwright = Playwright.create();) { Page page = playwright.chromium() .launch(new com.microsoft.playwright.BrowserType.LaunchOptions().setHeadless(true)) .newPage(); Response response = page.navigate(url); page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("example_com_screenshot.png"))); response.headers().forEach((key, value) -> { System.out.println(key + ": " + value); }); } } }
ディレクティブ
//JAVA
や//DEPS
のようなものをディレクティブと呼びます。こちらはJBang特有のディレクティブでJBang Directive
とドキュメントにも書いてあります。この記法を使い、依存関係やJavaのバージョンなどを解決していきます。
JAVA
Javaのバージョン指定をするディレクティブになります。
下記のようにJava21
固定なものとJava21以上
のと範囲を宣言できます。
//JAVA21 or //JAVA21+
PATHから該当するJavaのバージョンが見つからなかったら、実行時エラーとなります。
その場合は、jbang
でもJDKのインストールコマンドがあるので、実行してみてください。
jbang jdk install 21
SDKMANでもインストールは可能です。
sdk install java 21.0.7-tem
DEPS
依存関係を解決するディレクティブです。Gradleの依存解決の記法を採用しています。 Javaのソースコード内に必要な依存関係を書くだけで実行時にライブラリを取得してきてくれます。
//DEPS com.microsoft.playwright:playwright:1.52.0
REPOS
Maven Repositoryを指定するディレクティブです。central, jitpack, google
などが指定でき、個別で立てているMavenRepositoryは、key=value
の形で記述します。
//REPOS central,jitpack,google,MYREPO=https://www.example.com/
SOURCES
実行時に指定したJavaファイル以外のJavaファイルを指定するディレクティブです。いくつ書いてもOKです。今回の例ではPlayWrightの処理は、別ファイルに書いてますので、実行時に指定するJavaファイルに//SOURCES
でファイルを指定しないとコンパイルエラーになります。
//SOURCES ScreenShotService.java
FILES
//SOURCES
はJavaファイルでしたが、それ以外のファイルはFILESディレクティブ
で指定します。指定方法は//SOUECES
のときと同じで引数にファイル名を書く感じです。いくつ書いてもOKです。
//FILES application.yml
実行
$ jbang Sample.java [jbang] Resolving dependencies... [jbang] com.microsoft.playwright:playwright:1.52.0 [jbang] Dependencies resolved [jbang] Building jar for Sample.java... starting playwright. please input url. // URLの入力の促し https://www.example.com/ // ヘッダ情報の出力 accept-ranges: bytes alt-svc: h3=":443"; ma=93600,h3-29=":443"; ma=93600,quic=":443"; ma=93600; v="43" cache-control: max-age=2328 content-encoding: gzip content-length: 648 content-type: text/html date: Fri, 13 Jun 2025 08:43:17 GMT etag: "84238dfc8092e5d9c0dac8ef93371a07:1736799080.121134" last-modified: Mon, 13 Jan 2025 20:11:20 GMT vary: Accept-Encoding
スクリーンショットもとれています。
まとめ
今回は、JBang Directiveの一部を紹介しました。このソースコードだけでPlayWrightのサンプルを作ることができます。GradleやMavenの設定とかは書く必要はなくて、コード上に依存関係を書くだけなので、モックやサンプル実行などに最適なんじゃないかと思います。次回は、実際のアプリケーションを書いてみます。SpringBootやAIのサンプル実装を書いてみます。