【问题标题】:Generate a Java class from Clojurescript using Rhino使用 Rhino 从 Clojurescript 生成 Java 类
【发布时间】:2015-03-19 09:00:38
【问题描述】:

我想做以下事情:我有一个用 Clojure/ClojureScript 编写的简单函数:

(defn add
  [a b]
  (+ a b))

我想将此函数包装到 Java 类中并将其放入 jar 中,以便我可以在现有 Java/Android 项目中访问它。我之前的方法是使用 gen-class 并创建一个 uberjar。然而,这会导致一些problems

作为一种替代方法,我考虑使用 ClojureScript 编译函数(Sam Beran 也提出了一种解决方案)。

到目前为止,我了解如何:

我并不费力将 ClojureScript 输出转换为可以传递给 Rhino 编译器的格式。

有什么想法吗?

重要提示:我不想done here一样创建一个具有主函数的类!

【问题讨论】:

    标签: java javascript clojure rhino clojurescript


    【解决方案1】:

    解决此问题的一种一般方法是:

    在构建时:

    • 运行 ClojureScript 编译器以生成 JavaScript 文件
    • 将 JavaScript 文件放入资源目录。
    • 编译使用它的 Java 类
    • 制作 jar 文件(Uberjar 或普通 Unterjar)

    这个 Java 类应该:

    • 创建一个在初始化时启动 Rhino 的 java 类
    • 在实例化时从资源中运行 javascript。

    在服务器桌面上,您可能无法获得同样令人敬畏的启动时间。 Beran 报道了 android,因为 android 上的进程具有启动生命的优势,即通过预热运行时开始生命,Rhino 从它们启动的那一刻起就准备好了(它们从 Zygote 进程继承它)

    【讨论】:

    • 是的。但是这种方法会产生一个问题。来自 Sam Berans 的帖子:“[...],启动速度约为 8-10 秒——甚至比 JVM Clojure 还要差!一些快速测量表明,大部分时间都花在了 Rhino 解析 cljs/core 的 JS 源代码上。我很高兴地发现 Rhino 通过 jsc 实用程序 [3] 支持字节码预编译。我能够将 ClojureScript 输出预编译为字节码,并实现更快的启动 - 在设备上大约 150 毫秒。这完全在目标性能范围内,并且速度足够快,可以消除任何明显的 UI 延迟。”
    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多