3

JavaコードからClojure関数を呼び出したいのですが。この質問は最近尋ねられておらず、既存の回答は私にはうまくいきません。(Clojure 1.3、leiningen 1.7.0)。私は次の最小限のプログラムを持っています:

(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(5)のようにfooを直接呼び出す2番目の形式は、コンパイルすらしません。また、:gen-classの「static」宣言の有無にかかわらず試してみました。

4

1 に答える 1

1

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

java -cp '.:thing-1.0.0-SNAPSHOT-standalone.jar' HelloWorldApp
于 2012-03-23T22:07:48.000 に答える