折腾了半天打包。clojure因为语法凝练,所以微小的地方不注意,结果就不符合自己所需。
每一点配置都不能含糊。
一 clojure配置与打包
1 需要打包的源代码 gen-class
参考
(ns post-video.core
(:gen-class:mainfalse:methods [^:static [add1 [long] long]^:static [post_image [String] String]^:static [post_video [String] String]
]
)
(:require [clj-http.client :as client])
)
(defn-add1"I don't do a whole lot ... yet."
[a]
(+ 1, a))
需要说明的几点:
:main false 表示 不导出main函数
默认导出函数的前缀 :prefix ‘-’ 减号,那么每个需要导出的函数都加这个前缀就好
:methods 声明每个方法的Java下的类型接口。 因为clj以纯函数为主,所以基本都是java类上的static方法。
方法名没有减号
然后 clojure默认的整数类型是java未装箱的基本数据类型long, String不变,其他暂时没用到,不清楚。
2 project.clj
(defproject post-video "0.1.0-SNAPSHOT":description"FIXME: write description":url"http://example.com/FIXME":license {:name"EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0":url"https://www.eclipse.org/legal/epl-2.0/"}
:dependencies [[org.clojure/clojure "1.10.1"]
[clj-http "3.10.3"]
[org.clojure/data.json "1.0.0"]
]
:main^:skip-aot post-video.core
:target-path "target/%s":profiles {:uberjar {:aot :all
:jvm-opts ["-Dclojure.compiler.direct-linking=true"]}}
:omit-source true;without custom .clj
)
我增加了一句是为了避免jar包里同时发布class和clj源代码
参考
但是里面也说了,不发布源代码其实意义不大,因为java的.class其实还是可以反编译的。
3 打包
cd 到project.clj所在路径
lein uberjar
显示
Compiling post-video.core
Created /home/XX/target/uberjar/post-video-0.1.0-SNAPSHOT.jar
Created /home/XX/target/uberjar/post-video-0.1.0-SNAPSHOT-standalone.jar
在项目路径下创建2个jar,standalone 好几M,包括了各种clojure库,可以独立发布,供java或者其他jvm下的语言调用。
二 在java下调用jar
1. 创建java工程
最轻量的java工程:
2. 导入jar包
把standalone.jar复制到lib里,重启或者刷新下,直到在左下java project里能看到
然后main函数上方run按钮,运行,完事