繁体   English   中英

如何从Java调用Clojure代码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM