2012-03-23 13 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を直接呼び出す2番目の形式はfoo(5)のようにコンパイルされません。私はまた、 "静的な"宣言の有無にかかわらず、それを試しました:gen-class。

答えて

1

クラスパスを指定してプログラムを実行しているときに動作するようです。このようにしてみてください:

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

私は完全な-cpオプションを使ってjavaを起動していませんでした。 – sandover

関連する問題