直接调用' Clojure .lang. compiler .compile '来从Java编译Clojure



使用clojure.lang.Compiler.compile从Java编译Clojure是否合法?

我们的Java应用程序过去通过在具有proxy宏的.clj源上使用clojure.lang.Compiler.load来创建Clojure对象实例。现在我们想使用gen-class而不是proxy对这些对象进行AOT编译。这样,.class文件就可以四处移动,我们稍后再实例化对象。

到目前为止,我所做的最好的是说服clojure.lang.Compiler.compile为我生成加载器类文件("my/domain/lib__init.class")。但我似乎没有得到相应的。class文件,一个在命名空间("my/domain/lib$fnname__1234.class")和一个存根类文件为每个gen-class。这是在沙盒中使用非常简单的第一个示例,网址为http://clojure.org/compilation。我认为我已经正确地设置了编译路径,并将其设置为类路径中的某些内容,但也许那里仍然存在问题。

在任何情况下,我们实际的应用程序是基于RCP (Eclipse)的,这可能意味着它们在OSGI类加载器类路径方面需要更多的计算。与此同时,我只是想知道直接使用clojure.lang.Compiler.compile是否是一种有效的方法?

Edit:所以我现在让它产生所有的.class文件,但它需要各种未记录的初始化,这表明我对clojure.lang.Compiler的方法意味着是内部的。我必须适当地设置*compile-path*和*compile-files*为true,例如

RT.var("clojure.core", "*compile-files*").bindRoot(true);

您应该尝试使用clojure.core/compile函数。您还可以查看lein如何处理:aot参数来进行编译。

下面是一个直接从Java驱动Clojure编译器的例子。

        String clojureScript = "(ns user) (def hello (fn [] "Hello world"))";
        String notionalScriptFileName="hello.clj";
        String outputDirectory="/my/output/dir";
        Var compilePath = RT.var("clojure.core", "*compile-path*");            
        Var compileFiles = RT.var("clojure.core", "*compile-files*");
        Var.pushThreadBindings(RT.map(compilePath, outputDirectory, compileFiles, Boolean.TRUE));                        
        Compiler.compile(new StringReader(clojureScript), notionalScriptFileName, notionalScriptFileName);
        Var.popThreadBindings();

我在Clojure 1.4.0中测试了这个…您的里程可能与其他版本有所不同。

作为API,您需要提供一个"名义"文件名。这似乎只用于生成.class文件名。它生成的类文件被写入outputDirectory。

相关内容

最新更新