【发布时间】:2013-06-21 16:24:57
【问题描述】:
我需要将一些 clojure 文件编译成 java 字节码文件,将它们存储在磁盘上,以便稍后加载/执行它们。
我尝试了以下方法:
RT.load("clojure/core");
RT.init();
String clazz = "(ns org.rogach.avalanche.build (:gen-class)) (defn -doStuff [] (println 1))";
Compiler.load(new StringReader(clazz));
Compiler.load(new StringReader("(compile 'org.rogach.avalanche.build)"));
但它失败了:
Exception in thread "main" java.io.FileNotFoundException:
Could not locate org/rogach/avalanche/build__init.class or org/rogach/avalanche/build.clj on classpath
公平地说,如果我直接从 clojure REPL 执行该代码,会发生完全相同的事情。
此外,这种方法不允许我为类文件指定输出目录,这也很重要。
如何将 clojure 代码编译为类文件?
【问题讨论】:
-
好奇:为什么需要将 Clojure 代码编译成类文件? AOT 编译增加了很多复杂性,通常在运行时从 .clj 文件编译/加载 Clojure 代码更容易。对我来说听起来有点像“XY 问题”......
-
@mikera - 我有一个程序,它将 clojure 文件作为配置文件。我已经知道如何评估该代码,但这需要初始化 clojure 运行时,这需要大约 1 秒 - 我希望通过仅在更改配置时编译配置来解决此问题,如果未更改,只需加载并执行预编译的类文件。
-
那么这个问题的答案对你没有帮助......加载和初始化
clojure.core几乎可以肯定是导致启动时间的原因,而不是加载和编译你的配置文件。 -
那么没有~1秒的开销就绝对没有办法执行clojure代码?有没有办法加快速度?
-
Clojure 的启动时间总是很长,直到有人修改编译器/引导代码。我现在推荐的解决方案(如果您关心延迟)是保持持久的 JVM / REPL 实例运行,这样启动时间就不是问题了。
标签: java clojure compilation