ClojureをGraalVMを使用してネイティブバイナリにコンパイルする


clojureにechoコマンドを書き、GraalVMでネイティブバイナリにコンパイルします.

🥇 セットアップ


まず第一に.プロジェクトディレクトリエコー
mkdir /tmp/echo
基本的なdepsを追加します.エデン
{:paths ["src"]
 :deps {org.clojure/clojure {:mvn/version "1.11.0"}}}
src/echo/mainを作成します.CLJ .これは私たちのエントリポイントです.
(ns echo.main)

(defn -main [& args]
  (apply println args))
clj - m - m echoを実行します.すべてがうまく動くことを確認するメイン
clj -M -m echo.main foo bar
foo bar

🥈 ビルドuberjar


ビルドを追加します.プロジェクトのルートディレクトリへのclj.このファイルには、Java jarをビルドするロジックが含まれています
(ns build
  (:require [clojure.tools.build.api :as b]))

(def class-dir "target/classes")
(def basis (b/create-basis {:project "deps.edn"}))
(def jar-file "target/echo.jar")

(defn clean [_]
  (b/delete {:path "target"}))

(defn uberjar [_]
  (clean nil)
  (b/copy-dir {:src-dirs ["src"]
               :target-dir class-dir})
  (b/compile-clj {:basis basis
                  :src-dirs ["src"]
                  :class-dir class-dir})
  (b/uber {:class-dir class-dir
           :uber-file jar-file
           :basis basis
           :main 'echo.main }))
さあ、tools.buildを追加しましょう.エデン
{:paths ["src"]
 :deps {org.clojure/clojure {:mvn/version "1.11.0"}}
 :aliases {:build  
 {:deps  
 {io.github.clojure/tools.build {:git/tag "v0.8.1" :git/sha "7d40500"}}  
 :ns-default build}} }
そして最後のことは私たちのエコーをマークすることです.メインクラスとして
(ns echo.main
  (:gen-class))

(defn -main [& args]
  (apply println args))
Uberjarをビルドする準備ができました
clj -T:build uberjar
このコマンドは、ターゲットフォルダにjarファイルを作成します.Javaで実行できます
java -jar target/echo.jar foo bar
foo bar

🥉 ビルドネイティブ


ネイティブスクリプトをビルドするには、COMを追加する必要があります.ギタブ.ライブラリの自動化宣言への依存性としてのCLJ Easy/Garalビルド時間 — イニシアチブ
{:paths ["src"]
 :deps {org.clojure/clojure {:mvn/version "1.11.0"}
        com.github.clj-easy/graal-build-time {:mvn/version "0.1.4"}}
 :aliases
 {:build
  {:deps
   {io.github.clojure/tools.build {:git/tag "v0.8.1" :git/sha "7d40500"}}
   :ns-default build}}}
再構築瓶
clj -T:build uberjar
そして、バイナリを作るためにネイティブイメージを走らせる準備ができています
native-image -jar target/echo.jar --no-fallback --no-server target/echo
このコマンドはjarからtarget/echoへのネイティブバイナリを生成します
バイナリをテストしましょう
./target/echo foo bar
終わり🎉