gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:27:32 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com