[英]gen-class not generating a class
我在引用通過: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
所做的。
使用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,它將自行運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.