clojure打包发表jar 及java 调用
折腾了半天打包。clojure因为语法凝练,所以微小的地方不注意,结果就不符合自己所需。
每一点配置都不能含糊。
一 clojure配置与打包
1 需要打包的源代码 gen-class
参考
https://clojuredocs.org/clojure.core/gen-class
(ns post-video.core (:gen-class :main false :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源代码
参考
https://stackoverflow.com/questions/10759343/make-lein-uberjar-without-source-files
但是里面也说了,不发布源代码其实意义不大,因为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工程:
https://www.cnblogs.com/xuanmanstein/p/14148944.html
2. 导入jar包
把standalone.jar复制到lib里,重启或者刷新下,直到在左下java project里能看到
然后main函数上方run按钮,运行,完事
—————————————