我是一个初出茅庐的 Clojure 程序员,在 Eclipse 中使用过直接的 Java。我正在尝试让我的 Java 程序调用从http://dev.clojure.org/display/doc/Getting+Started+with+Eclipse+and+逆时针文章创建的简单“hello”函数。hello 函数在通过逆时针插件启动的 Clojure REPL 中运行良好。当我尝试从 Java 类执行 hello 函数时出现问题。
谷歌搜索发现基本上有两种方法可以做到这一点: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
如何配置我的逆时针项目以将 core.clj 的 .class 表示放入 classes 目录,以便可以直接从 Java 引用它?
这必须在不使用 Maven 等的情况下成为可能。不?