RSS ログイン
Date==== Time==== Update==== Time==== Title==== [[W]WRITE [RET]READ [?]HELP]
2024-08-30 04:05:33 2024-08-30 04:33:28 【備忘録】jarファイルをバイナリ化する、GraalVMを導入してみた
TEXT FILE (   4KiB ) を受信しますか? [Y]/[N] > Y

備忘録 JAVA GraalVM

はじめに

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

ターミナルで、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に接続しています、、、
ここまで変わるのか、と驚きました、それだけ()