るみさんのブログ

【備忘録】jarファイルをバイナリ化する、GraalVMを導入してみた

作成日:2024-08-30 04:05:33
最新更新日:2024-08-30 04:33:28

はじめに


JAVAをコンパイルすると、.jarというファイルが出来ますが、
之を実行するには、「java -jar jarファイル.jar」みたいにコマンドを打つ必要があります。
pixiv-dlpを作ったときに、それが嫌だったので、こういう感じのものを作って使っていました
/Data/Blog/a146ab62962871963ff73b68a56e868c_1724958475.png
java_runner.cの中身は、「引数をスペースごとに連結して、それをjavaの引数に入れて実行する」
と言ったもの。
極めて単純明快、要はjavaコマンドをCに変わりに入力させるわけ。
Cはコンパイルすればバイナリになり、/binに配置すればコマンドラインでそのまま実行できます!
/Data/Blog/a146ab62962871963ff73b68a56e868c_1724958548.png
Pythonの方は、「Cをコンパイルして/binに設置する」というもの、
之も単純明快ですね!!!
/Data/Blog/a146ab62962871963ff73b68a56e868c_1724958638.png

しかし、之をするにはJAVAが必須で、JAVAはバージョン関係がガチガチなので、色々めんどい。
なので之を解決することに!

GraalVM


Rustの話をDiscordでしているときに、「LLVM IR」というものを知り、
「JAVAからLLVM IRに変換する方法は無いかな」と思い調べたのがきっかけ、
どうやらGraalVMを使えばいけるらしい、実はこやつの存在自体は前から知っていたが、
めんどかったので手を付けていなかった。
ということでやっていく

インストール


1・GraalVMをダウンロード・インストール


ここにあくせす
したらば、JAVAのバージョンとOSを選んでダウンロードするだけ!
/Data/Blog/a146ab62962871963ff73b68a56e868c_1724958971.png
今回は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に接続しています、、、
ここまで変わるのか、と驚きました、それだけ()



シェア



コメント欄の復旧は少し待ってね