2012-03-23 77 views
3

我想从Java代码调用Clojure函数。这个问题最近没有被问到,现有的答案对我来说并不合适。 (Clojure 1.3,Leiningen 1.7.0)。我有以下几个最基本的程序:从Java调用Clojure 1.3

(ns thing.main 
    (:gen-class 
    :methods [#^{:static true} [foo [int] void]])) 

(defn -foo [i] (println "hello world, input is " i)) 

.clj看起来像这样的项目:

(defproject thing "1.0.0-SNAPSHOT" 
    :dependencies [[org.clojure/clojure "1.3.0"]] 
    :aot [thing.main] 
    :omit-source true) 

我产生uberjar,我把它复制到同一个目录与这个小Java程序。

import thing.*; 
class HelloWorldApp { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
     main.foo(5); // or, alternately, foo(5); 
    } 
} 

我编译使用这个命令:

javac -cp '.:thing-1.0.0-SNAPSHOT-standalone.jar' HelloWorldApp.java 

编译成功,但是当它运行(ClassNotFoundException的)程序失败。直接调用foo的第二种形式,如foo(5),甚至没有编译。我也尝试过,没有“静态”声明:gen-class。

回答

1

当我使用指定的类路径运行程序时,似乎适用于我。尝试是这样的:

java -cp '.:thing-1.0.0-SNAPSHOT-standalone.jar' HelloWorldApp 
+0

你说得对 - 我没有使用完整的-cp选项调用java。 – sandover 2012-03-23 23:02:09