jiichan.com

PROGRAMMING

Java
javascript
CSS
PHP

IntelliJ.Gradle.JavaFX (6) プラグイン org.beryx.jlink を使ってみる

ライブラリなど全てを含んだ Fatjar を作ったり、それを動かすためのカスタムランタイムも作りました。 その一連の作業を一発でやってくれるプラグインがありました。
それを試してみます。テスト用プロジェクトはfxJlinkです。

開発環境
IntelliJ IDEA 2021.2.2 (Community Edition)
jdk-15.0.1
javafx-sdk-15.0.1
javafx-jmods-15.0.1

プラグイン org.beryx.jlink を使ってみる

build.gradleにプラグインorg.beryx.jlinkを追加した。

plugins {
	id 'java'
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.10'
    id "org.beryx.jlink" version "2.24.1"
}

すると、右側のgradleツールのTasks → build には jlink の他にも jpackage のタスクもできていた。

Tasks → build → jlink を実行する

実行してしばらくすると、buildフォルダにimageフォルダができた。その中のbinフォルダ内にfxJlink.batができている。 それがアプリケーションランチャーのようだ。
バッチファイルをクリックすると、DOS窓に続きアプリケーションが立ち上がる。
ところが、QRコード表示のボタンをクリックするとエラーとなる。
IntelliJ.Gradle.JavaFX (3) plugin Jlink でカスタム JRE を作るにも書いたキャラクタセットのエラーだ。

そこで、module-info.javaにjdk.charsetsを追加した。

module com.fxjlink {
	requires javafx.controls;
	requires javafx.fxml;
	requires com.google.zxing;
	requires com.google.zxing.javase;
	requires java.desktop;
	requires jdk.charsets;  // jdepsの依存に出てこない
	
	
	opens com.fxjlink to javafx.fxml;
	exports com.fxjlink;
}

今度は、ボタンをクリックで問題なくQRコードが表示された。
Fatjarやカスタムランタイムを作る必要もなく、楽だ。
ただ、コマンドプロンプトの開きっぱなしがどうも気になる。

コマンドプロンプトを開かずにアプリを立ち上げるVBSを作る

jlinkタスクで出来上がったimageフォルダに、コマンドプロンプトを開かず立ち上げるVBSを置いた。

  • image(ここをアプリ名fxJlinkに替えて配布すると良い)
    • bin
    • conf
    • include
    • legal
    • lib
    • fxJlink.vbs
    • release

fxJlink.vbs
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c bin\fxJlink.bat", vbhide

fxJlink.vbs をクリックでコマンドプロンプト無しで、直に開くことができた。

Tasks → build → jpackage は実行できるか?

jpackageも試してみた。
順調に進んだかと思ったが、最後のところで jpackageimage のエラーが出てbuildフォルダには何も変化が無い。

新たにtestJlinkというプロジェクトを作り、intellijで出来たコードのまま、 build.gradleにプラグインorg.beryx.jlinkを追加しただけで実行してみた。 すると、下記のようなエラーがでたが、buildフォルダにjpackageフォルダができた。 中にはtestJlink.exeができていて、クリックするとすんなりアプリが立ち上がる。

SExecution failed for task ':jpackageImage'.
	> Process 'command 'C:\Java\jdk-15.0.1/bin/jpackage.exe'' finished with non-zero exit value 1

  • testJlink
    • app
    • runtime
    • testJlink.exe
    • testJlink.ico

因みに、出来上がったtextJlink.exeのアイコンはjavaアプリ既定のアイコンになっている。
試行錯誤して、build.gradleにjlinkタスクのオプション(下記)を追加したら、好みのアイコンに変更することができた。

jlink {
	jpackage {
		if (org.gradle.internal.os.OperatingSystem.current().windows) {
			// アプリケーションアイコンを指定。拡張子がicoのもの。
            imageOptions = ['--icon', 'src/main/resources/com/testJlink/apple.ico']
            imageOptions += ['--vendor', 'mken']
        }
    }
}

プラグイン org.beryx.jlink は楽で良い。
jpackage がエラーも無く使えれば VBS も作る必要がない。
できれば、そうなって欲しいものだ。