我很难引用通过: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.)
如果我进入项目根文件,没有目标文件夹,所以它不会生成类.如果我进入终端并运行lein compile,它会在target下生成所需的类,并且上面的代码运行时没有错误.这是一个糟糕的解决方法.如果我修改文件并忘记手动重新编译它会怎么样?在我干净的任何时候都必须手动编译它也是一件痛苦的事.
在黑暗中拍摄,我尝试在ns宏下使用编译:
(compile 'test-proj.test)
如果我使用破折号,那么编译似乎没什么用.我可能误解了它的用法,但它不会在目标下生成类文件.如果我使用下划线,它会给出一个例外,说明找不到命名空间.
有没有办法自动生成类,所以我不需要每次都运行lein编译?我认为那就是:project.clj中的那个.
最佳答案 使用Leiningen,指定:aot设置. :一切都是最简单的.
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,它将自行运行.