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

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

Javaをスクリプト言語っぽくするJBang その2(JAVA,DEPS,SOURCES,FILES, etc...)

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

//SOURCESJavaファイルでしたが、それ以外のファイルは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

スクリーンショットもとれています。

example_com_screenshot.png

まとめ

今回は、JBang Directiveの一部を紹介しました。このソースコードだけでPlayWrightのサンプルを作ることができます。GradleやMavenの設定とかは書く必要はなくて、コード上に依存関係を書くだけなので、モックやサンプル実行などに最適なんじゃないかと思います。次回は、実際のアプリケーションを書いてみます。SpringBootやAIのサンプル実装を書いてみます。