java - 如何从 Clojure 导出 Java 类 (.jar)?

标签 java node.js clojure node-java

我是 Clojure 和 Java 的新手。我有一个其他人写的现有 Clojure 项目,我正在尝试使用 node-java 嵌入到 NodeJS 中.

Clojure

该项目定义了一个提供某些公共(public)功能的命名空间,如下所示:

(ns my.namespace
  (:require ...etc...))

(defn dosomething ...)
(defn dosomethingelse ...)

我已经使用 leiningen(lein jarlein uberjar)构建了项目。

问题

#import() docs在 node-java 上说我需要像这样导入一个 java 类:

const java = require('java');
var Test = java.import('Test');
  1. 如何访问这些函数(可能是 Java 类静态方法?)
  2. 我是不是完全错了? =)

更新

感谢 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/

相关文章:

java - 使用静态方法更改类以在 Java 中进行接口(interface)的二进制兼容性

javascript - 如果我在 `module.exports` 上定义模块,那么 `global` 有什么好处?

clojure - 在 Clojure 中解释惰性帕斯卡三角形

java - Spring中使用@Bean的默认bean id是什么?

java - Android AsyncTask 与 ProgressDialog - 空对象引用

mysql - 在node js forEach中插入多个文本单个textarea

node.js - 如何重新激活 NVM?

clojure - 关于 Vars Clojure 的问题

vector - Clojure:对 map 向量中 map 中的每个值应用函数

java - 如何使用 Docx4j Java 从 Ms word 合并字段获取值