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按钮,运行,完事

 

posted @ 2020-12-17 12:56  永远的幻想  阅读(587)  评论(0编辑  收藏  举报