GraalVM을 사용하여 Clojure를 네이티브 바이너리로 컴파일

10668 단어 graalvmclojure
Clojure에서 echo 명령을 작성하고 GraalVM에 의해 네이티브 바이너리로 컴파일합니다.

🥇 설정



가장 먼저. 프로젝트 디렉토리 에코 만들기

mkdir /tmp/echo


기본 deps.edn 추가

{: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.main을 실행하여 모두 제대로 작동하는지 확인합니다.

clj -M -m echo.main foo bar
foo bar


🥈 uberjar 빌드



프로젝트의 루트 디렉터리에 build.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 }))


이제 deps.edn에 tools.build 및 :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}} }


마지막으로 echo.main을 :gen-class로 표시합니다.

(ns echo.main
  (:gen-class))

(defn -main [& args]
  (apply println args))


이제 우리는 uberjar를 만들 준비가 되었습니다.

clj -T:build uberjar


이 명령은 대상 폴더에 jar 파일을 만듭니다. 자바로 실행할 수 있습니다.

java -jar target/echo.jar foo bar
foo bar


🥉 네이티브 빌드



네이티브 스크립트를 빌드하려면 라이브러리 선언을 자동화하기 위해 com.github.clj-easy/graal-build-time을 종속성으로 추가한 후 설치해야 합니다._ — initialize-at-build-time_

{: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


끝 🎉

좋은 웹페이지 즐겨찾기