[英]How to Call Clojure Code From Java
我的教授允許我練習Clojure和Java! 我肯定是在利用這個機會,並希望讓我的第一個Java任務調用一些Clojure代碼。 在我進入實際作業之前,我想創建一個簡單,有效的例子。 我需要你的幫助。
我已經閱讀了一些關於Java / Clojure互操作性的鏈接。 這個 , 這個 。
我將使用第一個鏈接來演示我到目前為止所做的事情:
1)我創建了一個Clojure項目,從其中的站點轉儲.cli文件,並使用Eclipse中的導出函數將其作為.jar導出到我的Documents目錄中的文件夾。
2)我創建了第二個Java項目,將java文件轉儲到其中,並將clojure.jar添加為引用庫。
Clojure ns:
(ns com.tiny
(:gen-class
:name com.tiny
:methods [#^{:static true} [binomial [int int] double]]))
Java導入:
import com.tiny;
Java文件無法識別com.tiny
。 我不知道為什么。 這些網站提到了一些類路徑。 所以我在eclipse中找到了類路徑編輯器,並將帶有.jar的必需文件夾添加到路徑列表中。 這也行不通。
我不知道我做錯了什么。 我引用了jar,將它添加到類路徑中,並在第一個鏈接中完成了代碼的完整復制粘貼(除了包名稱)。
Java代碼:
import com.tiny;
public class Main {
public static void main(String[] args) {
System.out.println("(binomial 5 3): " + tiny.binomial(5, 3));
System.out.println("(binomial 10042, 111): " + tiny.binomial(10042, 111));
}
}
Clojure代碼:
(ns com.tiny
(:gen-class
:name com.tiny
:methods [#^{:static true} [binomial [int int] double]]))
(defn binomial
"Calculate the binomial coefficient."
[n k]
(let [a (inc n)]
(loop [b 1
c 1]
(if (> b k)
c
(recur (inc b) (* (/ (- a b) b) c))))))
(defn -binomial
"A Java-callable wrapper around the 'binomial' function."
[n k]
(binomial n k))
(defn -main []
(println (str "(binomial 5 3): " (binomial 5 3)))
(println (str "(binomial 10042 111): " (binomial 10042 111)))
)
為了成功運行您的示例,我執行了以下操作:
1)在Eclipse中創建了一個Clojure項目2)在src / com / tiny.clj中添加了文件tiny.clj 3)將該項目導出為.jar文件(例如:tiny.jar)
4)按照您的描述創建Java項目,使用一個Java文件 - Main.java 5)將clojure.jar和tiny.jar添加到Java項目的類路徑中。 (右鍵單擊 - >配置構建路徑 - >庫選項卡 - >添加外部JAR)
當我最初嘗試這個時,我沒有將tiny.clj文件放在com /目錄中(我直接在src /下),當我嘗試運行Main類時,我得到一個RuntimeException,該文件說文件很小。無法找到clj和tiny__init.class。 將tiny.clj文件移動到com /子目錄為我和主要雨成功解決了問題。
一個額外的鏈接,可能有助於這個主題:
clojure-utils庫包含從Java有效調用Clojure所需的代碼(沒有使用gen-class方法的復雜性)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.