簡體   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