【问题标题】:gen-class not generating a classgen-class 不生成类
【发布时间】: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 在这里并不理想,因为我正在测试我项目的一部分。为了我的理智,我想我可以暂时重新路由主干线。

标签: clojure gen-class


【解决方案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,但玩了一圈之后,似乎是唯一的方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多