gen-class不能生成类

4

我遇到了通过: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的作用。

@clartaq 不,我还没有。下班后我会尝试一下。谢谢。 - Carcigenicate
@clartaq 不对 :(。将其更改为 :aot :all 后,仍然出现相同的错误。仍未创建 target 文件夹。 - Carcigenicate
根据《Clojust Cookbook》所述:“一旦您的项目配置为AOT编译,您可以通过在命令行中调用lein compile来编译它。”似乎指定AOT实际上并不会导致编译;它只是标记后续应该编译的内容。 - Carcigenicate
既然我已经把所有东西都打出来了,我不确定它何时应该重新编译。我想我以为IDE/Cursive可以监听更改?或者什么的?我期望太多了吗? - Carcigenicate
@clartaq 我没能让它工作,但这也不是我关注的重点。也许我会再玩一下它。谢谢。 - Carcigenicate
显示剩余7条评论
1个回答

1
使用Leiningen,需要指定:aot设置。 :all是最简单的选项。

project.clj

(defproject test-proj "0.1.0-SNAPSHOT"
  :main test-proj.core
  :aot :all
  :dependencies [[org.clojure/clojure "1.8.0"]])

如果您愿意,可以按照下面所示的方式指定精确的命名空间数组:

project.clj

(defproject test-proj "0.1.0-SNAPSHOT"
  :main test-proj.core
  :aot [test-proj.core]
  :dependencies [[org.clojure/clojure "1.8.0"]])

接下来是以下的lein命令:
lein compile

将按照上述:aot设置生成字节码和.class文件。

core.clj

(ns test-proj.core
    (:gen-class))

(defn -main[]
  (println test_proj.core)
  (println "Hello, World!"))

您想看到类似下面的内容:
NikoMacBook% lein compile 
Compiling test-proj.core

完成后,请检查目标文件夹,确保包含正确的类文件,这里是 test_proj/core.class。
NikoMacBook% tree target 
target
├── classes
│   ├── META-INF
│   │   └── maven
│   │       └── test-proj
│   │           └── test-proj
│   │               └── pom.properties
│   └── test_proj
│       ├── core$_main.class
│       ├── core$fn__38.class
│       ├── core$loading__5569__auto____36.class
│       ├── core.class
│       └── core__init.class
└── stale
    └── leiningen.core.classpath.extract-native-dependencies

7 directories, 7 files

以下将运行:main命名空间,即test-proj.core。
lein run 

将输出
NikoMacBook% lein run 
Compiling test-proj.core
Compiling test-proj.core
test_proj.core
Hello, World!

请注意,该类正在调用自身。还要注意,如果您没有先运行 lein compile,则它会自动运行。

我不想一直手动调用 lein compile,但是经过尝试,似乎这是唯一的方法。谢谢。 - Carcigenicate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接