2013-01-22 45 views
4

我是一個初出茅廬的Clojure程序員,經驗豐富,他在日食中使用直接中間的Java。我試圖讓我的Java程序調用http://dev.clojure.org/display/doc/Getting+Started+with+Eclipse+and+Counterclockwise文章中創建的簡單的「hello」函數。 hello函數從通過逆時針插件啓動的Clojure REPL正常工作。當我嘗試從Java類執行hello函數時出現問題。從Java調用Clojure,他們說,這很容易,他們說

谷歌搜索顯示,基本上有兩種方法可以做到這一點:clojure.lang.RT可以加載Clojure源代碼並將其作爲腳本執行,或者直接將Clojure源代碼編譯爲JAR。

clojure.lang.RT變體沒有問題,但我完全不知道如何獲得直接調用變體的工作。在Java文件中,編譯器無法解析「myproject.core」。

Clojure的來源是core.clj是如下,並通過REPL工程就像一個冠軍:

(ns myproject.core 
    (:gen-class 
    :name myproject.core 
    :methods [#^{:static true} [hello [String] String]])) 

(defn -main 
    "I don't do a whole lot." 
    [& args] 
    (println "Hello, World!")) 

(defn hello [who] (str "Hello " who " !")) 

的Java源代碼,但是,不會編譯:

import java.io.*; 
import clojure.lang.*; 
public class HelloJava { 
    public static void main(String[] args) { 
     loadResourceVariant(); 
     directVariant(); 
    } 

    public static void directVariant() { 
     myproject.core.hello("Bob"); 
    } 

    public static void loadResourceVariant() { 
     try { 
      RT.loadResourceScript("myproject/core.clj"); 
      // Get a reference to the hello function. 
      Var hello = RT.var("myproject.core", "hello"); 
      // Invoke the hello function 
      Object result = hello.invoke("Robert"); 
      System.out.println(result); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

的編譯器錯誤是...

myproject.core cannot be resolved to a type HelloJava.java /myproject/src line 11 Java Problem 

如何配置我的逆時針項目將.class表示core.clj放入classes目錄,這樣它可以直接從Java引用?

這必須是可能的,而不需要全面的Maven之類。沒有?

+1

Upvote for title :) –

回答

0

我從Java調用的Clojure的方法是進行API命名空間,通常是從執行命名空間分隔:

(ns test.api 
    (:use [test.impl :only [f1 f2]]) 
    (:gen-class 
    :methods [#^{:static true} [exportedF1 [String] int] 
       #^{:static true} [exportedF2 [String String] void]])) 

(defn -exportedF1 [^String query ^String file] (f1 query file)) 
(defn -exportedF2 [^String query] (f2 query)) 

話,我一定要AOT該命名空間,並uberjar它。

現在只需將該jar包含在您的java classpath中,然後即可開始使用。

+0

這會工作,但實際上不適合我的工作流程。我的意思是,你必須完成你的clojure工作,JAR它,將它導入到Java中,並繼續工作。我正在嘗試的工作流程是同時更改Clojure和Java,並像普通Java項目一樣擁有項目「鏈接」。 –

+0

是的,我所做的是在eclipse上設置了兩個項目,然後在java項目中,我直接從clojure項目的目標目錄中將clojure jar添加到構建路徑。另一種選擇是:在我的另一個項目中,我簡單地使用lein作爲java構建的工具,所以我在同一個項目(甚至是scala!)上都有java和clojure,並且我可以更改java,scala或clojure和它將編譯和運行就好!看看這裏http://bit.ly/12kzshw。不要說它是完美的,但它的選擇,希望這有助於 – Shlomi

相關問題