Clojure:從Java調用Clojure


我們要在Java中調用Clojure有兩種方法,一種是將Clojure代碼生成class文件,另外一種是通過Clojure RT方式直接在java程序中調用Clojure代碼。兩種方式各有優缺點,

 

第一種方式的優點在於在Java調用class與平常的java代碼沒有任何區別,而且對IDE友好。並且由於是預編譯了代碼,在運行時會有一些速度優勢。但是缺點是會損失一些Clojure動態語言的優勢。第二種方式則和第一種正好相反。

 

在這里,我們只講第一種方法。

 

首先,我們通過Leinigen創建一個Clojure項目。

lein new hello_clojure

生成后目錄結構如下:

 

修改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程序中。

 

修改hello_clojure目錄下的core.clj程序如下:

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。

 

切換到命令行,運行如下命令:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM