2012-03-23 5 views
3

Я бы назвал функцию Clojure из Java-кода. Этот вопрос не задавался в последнее время, и существующие ответы не работают на меня. (Clojure 1.3, leiningen 1.7.0). У меня есть следующая минимальная программа:Вызов Clojure 1.3 из Java

(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

Вы правы - я не вызывал java с опцией full -cp. – sandover