naoki86star

インターネットの片隅でなにかしら書いてみる

(sbt-plugin) sbt-native-packagerのメモ

 先日来launch4jを調べていたけども、javaでの実行可能ファイル化の方法には、java8からjavapackagerなるものが存在したようで、こっちがいいかとちょっと調べてみてる。直接使ってみるところからやりたいのだけども、引数makeallコマンドとか試しに叩いてみても前段とか必要なようでとりあえず”さっぱりわからない".

 今の仕事は、sbtというscala言語のビルドツールに依存しているので、そのビルドツールプラグインからアプローチすることにしてみる。ずばりjavapackagerをラップするsbt-native-packagerというのを試してみる。javapackagerをラップというのは正確でなくて、ネイティブなパッケージ化手順を系統的に提供してくれる(ここ)プラグイン、とのこと。

 前提として、このsbt-native-packagerはsbtでビルドして実行可能なファイル環境を対象にパッケージ化してくれる。うまく使いこなすと設定だけでパッケージ化単独機能を使えるのかもしれない。

  • UniversalPackager

よく.zipとか.tar.gzでダウンローダブルになってる形式のアーカイブを作ってくれる機能
他のパッケージ化を実行するにしても手続き的にはまずこれに依存しているようである。

  • WindowsPackager

Windows専用
WIXというインストーラ作成ツールのバージョン3を使用する。自然と誘導されるバージョン4最新版はコマンド名からして違うらしい。

  • JdkPackager

各種OS(Linux/Windows/macOS)用のパッケージ化が可能。クロスで作ってくれるわけではなさそうで、Linuxで動かせばdebかrpm,Windowsで動かせば.msiをそれぞれ最終的に出力してくれる。

 試してみたのは、一切カスタマイズなしデフォルトで、swingを使う簡単なUIプログラムをinstaller化。java8で試してみた。パッケージ化に際してはjdk環境が必要で、java11以降ではbuild.sbtに追加設定が必要かもしれない。

 実用していくならもっと細かい設定を理解していく必要ある。これsbt-native-packagerに限らずsbtのプラグインはそのソースから設定にはどんな項目あるかを見ないと理解が追い付かない部分がある。
 逆に考えると、javapackagerの使用方法の習得手段が乏しいので、これJdkPackagerの設定・動作から理解していけるという側面も見出せそうだ。

直接関係ない話

 sbt-assemblyというプラグインにもお世話になっている。今回一度これの設定を誤ってひどい目にあった。本質的にはsbt/sbt-plugin全般で気を付けるべきことなのかもしれない話。sbt-assemblyは実行に必要なjvmランタイム以外の必要ライブラリ含めたjava アーカイブを出力してくれる*1。通常はアウトプットjarをプロジェクトのtargetディレクトリ以下のところに出力しする。これを変更するのにassemblyOutputPathという項目があって普通は設定追加する必要はない。sbt-native-packagerとリンクさせるのを試してみたく、これを変えてまずcleanをかけたらプロジェクト以下のほとんどのファイルが消えてしまった。assemblyOutputPath=file(baseDirectory.value)とかに設定したと思うのだが、build.sbt含めて消えてしまって正確になにをしたらこうなったを説明できない。けれどもcleanでは関連する生成ファイルを消去するので、誤った設定をしたらこうなり得る、ということだと思う。プロジェクトディレクトリのトップにあった.gitディレクトリまで消されてしまった。2バージョンくらいローカルコミットが吹っ飛んだ。バックアップ大事。

*1:closure/leiningenだとuberjarコマンドが似てる