gen-class 没有生成 class
gen-class not generating a class
我在引用通过 :gen-class
生成的 classes 时遇到困难。
我能展示的最小示例是:
(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
文件夹,所以它不会生成 class。如果我进入终端并 运行 lein compile
,它会在 target
下生成所需的 classes,并且上面的代码 运行s 没有错误。虽然这是一个糟糕的解决方法。如果我修改了文件而忘记手动重新编译它怎么办?每次我执行 clean
.
之后都必须手动编译它也很痛苦
作为摸索,我尝试在 ns
宏的正下方使用 compile
:
(compile 'test-proj.test)
如果我使用破折号,compile
似乎什么也没做。我可能误解了它的用法,但它不会在 target
下生成 class 个文件。如果我使用下划线,它会给出一个异常,提示找不到命名空间。
有没有办法让 classes 自动生成,这样我就不需要每次都 运行 lein compile
了?我认为那是 project.clj
中的 :aot
所做的。
使用 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
将生成字节码和 .class 文件,如上面 :aot 设置中指定的那样。
core.clj
(ns test-proj.core
(:gen-class))
(defn -main[]
(println test_proj.core)
(println "Hello, World!"))
您想看到如下内容:
NikoMacBook% lein compile
Compiling test-proj.core
完成后,检查目标文件夹,其中包含正确的 class 文件,此处为 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!
请注意,class 正在调用自身。另请注意,如果您不预先 运行 lein 编译,它将自行 运行。
我在引用通过 :gen-class
生成的 classes 时遇到困难。
我能展示的最小示例是:
(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
文件夹,所以它不会生成 class。如果我进入终端并 运行 lein compile
,它会在 target
下生成所需的 classes,并且上面的代码 运行s 没有错误。虽然这是一个糟糕的解决方法。如果我修改了文件而忘记手动重新编译它怎么办?每次我执行 clean
.
作为摸索,我尝试在 ns
宏的正下方使用 compile
:
(compile 'test-proj.test)
如果我使用破折号,compile
似乎什么也没做。我可能误解了它的用法,但它不会在 target
下生成 class 个文件。如果我使用下划线,它会给出一个异常,提示找不到命名空间。
有没有办法让 classes 自动生成,这样我就不需要每次都 运行 lein compile
了?我认为那是 project.clj
中的 :aot
所做的。
使用 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
将生成字节码和 .class 文件,如上面 :aot 设置中指定的那样。
core.clj
(ns test-proj.core
(:gen-class))
(defn -main[]
(println test_proj.core)
(println "Hello, World!"))
您想看到如下内容:
NikoMacBook% lein compile
Compiling test-proj.core
完成后,检查目标文件夹,其中包含正确的 class 文件,此处为 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!
请注意,class 正在调用自身。另请注意,如果您不预先 运行 lein 编译,它将自行 运行。