咱們要在Java中調用Clojure有兩種方法,一種是將Clojure代碼生成class文件,另一種是經過Clojure RT方式直接在java程序中調用Clojure代碼。兩種方式各有優缺點,html
第一種方式的優勢在於在Java調用class與日常的java代碼沒有任何區別,並且對IDE友好。而且因爲是預編譯了代碼,在運行時會有一些速度優點。可是缺點是會損失一些Clojure動態語言的優點。第二種方式則和第一種正好相反。java
在這裏,咱們只講第一種方法。eclipse
首先,咱們經過Leinigen建立一個Clojure項目。函數
lein new hello_clojureurl
生成後目錄結構以下:spa
修改project.clj文件以下:命令行
1 (defproject hello_clojure "0.1.0-SNAPSHOT" 2 :description "FIXME: write description" 3 :url "http://example.com/FIXME" 4 :license {:name "Eclipse Public License" 5 :url "http://www.eclipse.org/legal/epl-v10.html"} 6 :dependencies [[org.clojure/clojure "1.5.1"]] 7 :aot [hello-clojure.core] 8 :main hello-clojure.core)
注意其中:aot和:main的代碼。:aot的意思是預編譯hello-clojure.core程序。:main的意思是主函數入口位於hello-clojure.core程序中。code
修改hello_clojure目錄下的core.clj程序以下:htm
1 (ns hello-clojure.core 2 (:gen-class 3 :methods [#^{:static true} [hello [String] String]])) 4 5 (defn -hello 6 "Say Hello." 7 [x] 8 (str "Hello " x))
9 (defn -main [] (println "Hello from main"))
注意其中的關鍵代碼:gen-class,經過它咱們就能夠生成包含hello方法的class。blog
切換到命令行,運行以下命令:
lein compile
lein uberjar
這時會在target目錄下生成hello_clojure-0.1.0-SNAPSHOT.jar和hello_clojure-0.1.0-SNAPSHOT-standalone.jar兩個jar文件。若是目標項目沒有Clojure類庫的話,咱們能夠使用standalone的jar包。
如今咱們能夠在java程序中調用此jar包了。首先讓咱們新建一個java項目,將剛剛生成的jar包引入到lib中。調用代碼以下:
1 package com.hello; 2 3 import java.io.IOException; 4 import hello_clojure.core; 5 6 public class CallClojure { 7 public static void main(String[] args) throws IOException { 8 String callResult = core.hello("Neo"); 9 System.out.print(callResult); 10 } 11 }
能夠看到這是很普通的java代碼,沒有任何特殊之處。這段代碼輸出的結果應爲
Hello Neo
那麼咱們再試試main方法,咱們直接在命令行中輸入
java -jar target/hello_clojure-0.1.0-SNAPSHOT-standalone.jar
這時的輸出結果應爲
Hello from main