2011-03-27 78 views
3

我的教授讓我做這兩樣的Clojure和Java!我肯定會利用這個機會,並希望讓我的第一個Java任務調用一些Clojure代碼。在我去實際任務之前,我想創建一個簡單的工作示例。我需要你的幫助。如何調用Clojure的代碼與Java

我已閱讀關於Java/Clojure的互操作性幾個環節。 ThisThis

我將使用第一個鏈接來證明什麼,我迄今所做的:

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的路徑添加到列表中所需的文件夾。這也沒有奏效。

我不知道我在做什麼錯。我曾經引用的罐子,把它添加到類路徑,並在第一個鏈接(除了包名)做了代碼的完整拷貝 - 粘貼。

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))) 
) 

回答

4

順利拿到你的榜樣跑,我做了以下內容:

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,該類說tiny.clj和tiny__init.class文件找不到。將tiny.clj文件移動到com /子目錄可以成功解決我和Main雨的問題。

+0

感謝您的幫助。我仍然收到「導入無法解決」的錯誤。 'Main.java'文件位於默認位置,構建路徑同時包含'clojure.jar'和'tiny.jar',並且源位於程序中最高位置。我在整個小項目上使用'export',而不僅僅是文件。我也試着將.clj文件導出爲.jar文件。我重新排列了順序,但仍然沒有任何結果。我錯過了什麼? – IAE 2011-03-28 14:41:46

+1

@SoulBeaver:我可能會嘗試解壓其中包含Clojure代碼的.jar文件,只是爲了確保Eclipse做了正確的事情並將文件導出到適當的位置。對我來說,工作配置是:[/tiny__init.class,/com/tiny.clj,(...和一堆其他東西)]。 – roblg 2011-03-28 15:39:53