我的教授让我做这两样的Clojure和Java!我肯定会利用这个机会,并希望让我的第一个Java任务调用一些Clojure代码。在我去实际任务之前,我想创建一个简单的工作示例。我需要你的帮助。如何调用Clojure的代码与Java
我已阅读关于Java/Clojure的互操作性几个环节。 This和This。
我将使用第一个链接来证明什么,我迄今所做的:
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)))
)
感谢您的帮助。我仍然收到“导入无法解决”的错误。 'Main.java'文件位于默认位置,构建路径同时包含'clojure.jar'和'tiny.jar',并且源位于程序中最高位置。我在整个小项目上使用'export',而不仅仅是文件。我也试着将.clj文件导出为.jar文件。我重新排列了顺序,但仍然没有任何结果。我错过了什么? – IAE 2011-03-28 14:41:46
@SoulBeaver:我可能会尝试解压其中包含Clojure代码的.jar文件,只是为了确保Eclipse做了正确的事情并将文件导出到适当的位置。对我来说,工作配置是:[/tiny__init.class,/com/tiny.clj,(...和一堆其他东西)]。 – roblg 2011-03-28 15:39:53