我是 Clojure 和 Java 的新手。我有一个其他人写的现有 Clojure 项目,我正在尝试使用 node-java 嵌入到 NodeJS 中.
Clojure
该项目定义了一个提供某些公共(public)功能的命名空间,如下所示:
(ns my.namespace
(:require ...etc...))
(defn dosomething ...)
(defn dosomethingelse ...)
我已经使用 leiningen(lein jar
和 lein uberjar
)构建了项目。
问题
#import() docs在 node-java 上说我需要像这样导入一个 java 类:
const java = require('java');
var Test = java.import('Test');
- 如何访问这些函数(可能是 Java 类静态方法?)
- 我是不是完全错了? =)
更新
感谢 Magos(下面的回答),我取得了更多进展。事实证明,我可以在 (ns ...)
范围内使用 (:gen-class :name my.name)
来告诉它生成一个类。如果我像这样向 project.clj 添加配置文件:
...
:profiles {
...
:uberjar {:aot :all}
}
...
它将编译,我现在可以在 Node.js 中看到该类。不过,我仍然没有弄清楚如何导出这些方法。现在正在处理该部分。
最佳答案
由于其他人编写了 Clojure,我假设您无法控制它。使用来自其他 JVM 语言的 Clojure 代码的推荐方法是从类 clojure.java.api.Clojure
引导。 .此类允许您从 Clojure 解析 Vars,并通过解析和调用其他核心 Clojure 函数来加载您自己的代码。根据您的示例,它可能看起来像这样:
const java = require('java');
var clojure = java.import('clojure.java.api.Clojure');
IFn require = clojure.var("clojure.core", "require");
require.invoke(clojure.read("my.namespace"));
IFn doSomething = clojure.var("my.namespace","dosomething");
//doSomething.invoke(....
如果您确实控制了 Clojure,:gen-class
allows you to export functions as methods of the namespace's generated class .
关于java - 如何从 Clojure 导出 Java 类 (.jar)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45510932/