【備忘録】jarファイルをバイナリ化する、GraalVMを導入してみた
作成日:2024-08-30 04:05:33
最新更新日:2024-08-30 04:33:28
はじめに
JAVAをコンパイルすると、.jarというファイルが出来ますが、
之を実行するには、「java -jar jarファイル.jar」みたいにコマンドを打つ必要があります。
pixiv-dlpを作ったときに、それが嫌だったので、こういう感じのものを作って使っていました
java_runner.cの中身は、「引数をスペースごとに連結して、それをjavaの引数に入れて実行する」
と言ったもの。
極めて単純明快、要はjavaコマンドをCに変わりに入力させるわけ。
Cはコンパイルすればバイナリになり、/binに配置すればコマンドラインでそのまま実行できます!
Pythonの方は、「Cをコンパイルして/binに設置する」というもの、
之も単純明快ですね!!!
しかし、之をするにはJAVAが必須で、JAVAはバージョン関係がガチガチなので、色々めんどい。
なので之を解決することに!
GraalVM
Rustの話をDiscordでしているときに、「LLVM IR」というものを知り、
「JAVAからLLVM IRに変換する方法は無いかな」と思い調べたのがきっかけ、
どうやらGraalVMを使えばいけるらしい、実はこやつの存在自体は前から知っていたが、
めんどかったので手を付けていなかった。
ということでやっていく
インストール
1・GraalVMをダウンロード・インストール
ここにあくせす
したらば、JAVAのバージョンとOSを選んでダウンロードするだけ!
今回はJava 21、LINUXの64bitです。
tar -xzf ダウンロードしたファイル名で解凍、Tarのオプション覚えにくいよね。
解凍すると、フォルダが生成されます、これをお好きなディレクトリに置いてください。
私は
/bin/GraalVMに置きました!
次は、.bashrcに環境変数を書きましょう、
export JAVA_HOME=GraalVMを入れたフォルダ
export PATH=GraalVMを入れたフォルダ/bin:$PATH
とします、後者のは必ず最後に
/binを入れてね。。。
ターミナルで、
native-imageと入力してなにか出ればおk!
2・プロジェクト側の設定変更
build.gradleと、setting.gradleを編集します、
build.gradle
//次を「plugins」に追加
id 'org.graalvm.buildtools.native' version '0.10.1'
id 'application'
//jar manifestでMain-Classを定義しているなら、jarごと次に置き換え
application {
mainClass.set(メインクラス)
}
//最後に追加
graalvmNative {
agent {
defaultMode = "standard"
}
binaries {
main {
imageName.set("バイナリの名前")
buildArgs.add("--no-fallback")
}
}
metadataRepository {
enabled = true
}
}
setting.gradle
//「「「先頭」」」に追加
pluginManagement {
repositories {
mavenCentral()
gradlePluginPortal()
}
}
完成!!!!
コンパイル方法は、
./gradlew nativeCompileです!
でもこれ時間がかかるので、デバッグ目的ならjarを生成するほうが良いです、之は好きな方法でどうぞ!
驚いたこと
「JAVAが遅い」という話は聞いたことがあります、
Pythonが遅いJSは早いとかいう戯言よりは理解できます、ネイティブに動いているのではなく
VMか何かを経由しているからですね、、、
やはりCとかRustみたいなネイティブに動く言語には劣りますが、スクリプト言語よりは早い。
と思っています。
「でもそれってあんま変わらんでしょ」と思っていたんですが、その考えは直ぐに覆されることに
←がJAVA
→がGraalVMで生成したバイナリ
なんと、目で見て分かる速度の違いが!
起動速度もですが、起動した瞬間に人間には認識できない、
というかモニターのフレームレートを超える速度でHTTP鯖を起動してSQLに接続しています、、、
ここまで変わるのか、と驚きました、それだけ()