【发布时间】:2017-09-27 12:45:02
【问题描述】:
我在引用通过 :gen-class 生成的类时遇到困难。
我可以展示的最小示例是:
(defproject test-proj
:dependencies [[org.clojure/clojure "1.8.0"]]
:aot [test-proj.test])
(ns test-proj.test
(:gen-class))
(defn -main []
(println test_proj.test)) ; Error here
问题是,这会在标记线上产生ClassNotFoundException。
(我在上述文件和project.clj 中尝试了- 和_ 的所有不同组合。我仍然不完全理解什么需要下划线以及什么可以容忍破折号。有些事情似乎随着破折号并根据需要进行转换,而我知道在 -main 中搞砸了,我需要下划线来引用 test_proj.test。)
如果我进入项目根文件,没有target 文件夹,所以它不会生成类。如果我进入终端运行lein compile,它会在target下生成所需的类,上面的代码运行没有错误。这是一个糟糕的解决方法。如果我修改文件并忘记手动重新编译它怎么办?在我每次执行clean 之后必须手动编译它也很痛苦。
作为在黑暗中的镜头,我尝试在 ns 宏下方使用 compile:
(compile 'test-proj.test)
如果我使用破折号,compile 似乎什么都不做。我可能误解了它的用法,但它不会在target 下生成类文件。如果我使用下划线,它会给出一个异常,指出找不到命名空间。
有没有办法让类自动生成,这样我就不需要每次都运行lein compile?我认为这就是project.clj 中的:aot 所做的。
【问题讨论】:
-
你在项目文件中试过
:aot :all吗?它会给出不同的结果吗? -
@clartaq 不,我没有。我下班时会试试。谢谢。
-
@clartaq Nope :(。将其更改为
:aot :all后,我仍然遇到同样的错误。仍然没有创建target文件夹。 -
根据“Clojust Cookbook”:“一旦你的项目被配置为AOT编译,你可以通过在命令行调用
lein compile来编译它。”。似乎指定 AOT 实际上不会导致编译;它只标记以后应该编译的内容。 -
如果你运行
lein run,它可以工作,但如果你直接调用-main,它就不行。lein run在这里并不理想,因为我正在测试我项目的一部分。为了我的理智,我想我可以暂时重新路由主干线。