お断り(disclaimer):もちろんこの手順は無保証です。

前回GraalVMを使ってLinuxの実行モジュールを作りました。 色々と調べるとCambadaがあってこっちのほうがなんとなーく簡単な 感じだったのでお試ししました。 環境変数はこのままで変更してません。少なくともPathを通しておく必要は あるですね。

export GRAALVM_HOME=${INSTALLED_DIR}
export PATH=${PATH}:${GRAALVM_HOME}/bin

treeした結果はこーんな感じです。

.
├── deps.edn
├── src
│   └── main
│       └── core.clj
└── test
    └── main
        └── core_test.clj

4 directories, 3 files


Clojureのソースは

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

(defn -main[]
  (print "Hello,World"))

です。大したことやっていません。

TestCodeは

(ns main.core-test
  (:require [clojure.test :as t]
            [main.core :as sut]))

(t/deftest basic-tests
  (t/testing "it says hello to everyhone"
    (t/is (= (with-out-str (sut/-main)) "Hello,World"))))

deps.ednはコーンな感じ

{:deps
   {org.clojure/clojure {:mvn/version "1.10.0"}}
 :aliases
   {:test
     {:extra-paths ["test"]
      :extra-deps 
        {com.cognitect/test-runner 
          {:git/url "https://github.com/cognitect-labs/test-runner.git"
           :sha "209b64504cb3bd3b99ecfec7937b358a879f55c1"}}
      :main-opts ["-m" "cognitect.test-runner"]}
    :uberjar
      {:extra-deps
        {luchiniatwork/cambada
          {:mvn/version "1.0.0"}}
       :main-opts  ["-m" "cambada.uberjar" "-m"  "main.core"] }
    :native-image
      {:extra-deps
        {luchiniatwork/cambada
          {:mvn/version "1.0.0"}}
       :main-opts  ["-m" "cambada.native-image" "-m"  "main.core"] }
} }

TestはCognitect Test Runnerを使いました。 あとはREADME.MDのままです。

これでCLIから

clj -A:test

ってやるとTest Runnerが動いてくれます。

Running tests in #{"test"}

Testing main.core-test

Ran 1 tests containing 1 assertions.
0 failures, 0 errors.

ではCLIから

clj -A:uberjar

Cleaning target
Creating target/classes
  Compiling main.core
Creating target/main-1.0.0-SNAPSHOT.jar
Updating pom.xml
Creating target/main-1.0.0-SNAPSHOT-standalone.jar
  Including main-1.0.0-SNAPSHOT.jar
  Including clojure-1.10.0.jar
  Including spec.alpha-0.2.176.jar
  Including core.specs.alpha-0.2.44.jar
Done!

でtarget配下にjarができちゃいます。

またCLIから

clj -A:native-image

ってやると

Cleaning target
Creating target/classes
  Compiling main.core
Creating target/main
[target/main:5489]    classlist:   5,314.19 ms
[target/main:5489]        (cap):   2,082.70 ms
[target/main:5489]        setup:   5,900.93 ms
[target/main:5489]   (typeflow):  18,074.05 ms
[target/main:5489]    (objects):   3,867.74 ms
[target/main:5489]   (features):     263.63 ms
[target/main:5489]     analysis:  22,537.37 ms
[target/main:5489]     universe:     694.03 ms
[target/main:5489]      (parse):   6,022.45 ms
[target/main:5489]     (inline):   5,749.60 ms
[target/main:5489]    (compile):  35,960.57 ms
[target/main:5489]      compile:  48,706.00 ms
[target/main:5489]        image:   2,009.25 ms
[target/main:5489]        write:   1,523.79 ms
[target/main:5489]      [total]:  86,855.55 ms

Done!

targetの配下に実行モジュールができます。

これをベースにして色々と実験してみるかのぉ。