2011-03-27 61 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