なんでエラーが出たの?
java.awt.AWTError: Assistive Technology not found: com.sun.java.accessibility.AccessBridge
や Caused by: java.lang.ClassNotFoundException: com.sun.java.accessibility.AccessBridge
というエラーが起きている可能性があります。
その他にも開発環境では出ないようなClassNotFoundException
が起きている可能性があります。
Compsoe for Desktop
などでも発生するかも知れません。
このようなダイアログが出ている人もいると思います。
これらはJava のアクセシビリティ機能でスクリーンリーダーなどの機能を使えるようにするものです。
どうしたら直るの?
こういう場所があると思います。1
compose.desktop {
application {
mainClass = "MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb, TargetFormat.Exe)
packageName = "multim-gui"
packageVersion = "1.0.0"
}
}
}
jdk.accessibility
を追加します。他にも追加しなければいけないものがある場合もあると思うので適宜追加してください。
gradleタスクsuggestRuntimeModules
やjdepsなどで確認することが出来ます。
(が、私の環境ではjdk.accessibilityは検出されませんでした。)
compose.desktop {
application {
mainClass = "MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb, TargetFormat.Exe)
packageName = "multim-gui"
packageVersion = "1.0.0"
modules("jdk.accessibility") //←これ
}
}
}
これは何?
Compose-Multiplatformはexeなどを生成するとき、jlinkというものを使用します。これは簡単に言えば必要最小限のJREを生成するようなもので、とりあえず配布するときのサイズを小さくしてくれます。
このとき何が必要で何が必要ではないかを教えてあげる必要があります。その作業を手動で行うとき、jdepsで依存を検索してmodule-info.java
に書くのですが、それに相当する作業が上のmodules("module.name")
です。
なおらないんだが?
まだ必要なモジュールを追加できていない可能性があります。
とりあえず動かしたい場合はincludeAllModules
フラグをtrueにセットしてあげるとすべてのモジュールをインポートしてくれます。1
当たり前ですがサイズが大きくなるので最終的にはmodulesでの指定に戻す方がいいです。