我有一個使用「lein uberjar」構建的小型命令行Clojure應用程序。結果jar文件在啓動時不會調用我的主函數,也不會給我任何類型的堆棧跟蹤或其他錯誤情況的指示。用lein uberjar構建的Clojure應用程序未啓動
% lein version
Leiningen 2.0.0 on Java 1.7.0_10 Java HotSpot(TM) 64-Bit Server VM
% lein uberjar
Compiling spelunker.core
Compiling spelunker.core
Created /Users/temerson/Work/ddp-qa-tool/spelunker/target/spelunker-0.1.0-SNAPSHOT.jar
Including spelunker-0.1.0-SNAPSHOT.jar
Including lucene-core-3.6.2.jar
Including clojure-1.4.0.jar
Created /Users/temerson/Work/ddp-qa-tool/spelunker/target/spelunker-0.1.0-SNAPSHOT-standalone.jar
% java -jar target/spelunker-0.1.0-SNAPSHOT-standalone.jar
%
它應該顯示一條使用消息,而不是任何東西。我檢查了(我)很明顯的事情:我的項目文件中包含
(defproject spelunker "0.1.0-SNAPSHOT"
:description "Spelunk through Lucene data to find nuggets of useful data."
:dependencies [[org.clojure/clojure "1.4.0"]
[org.apache.lucene/lucene-core "3.6.2"]]
:main spelunker.core
:aot [spelunker.core])
和spelunker/core.clj包括
(ns spelunker.core
(:import (org.apache.lucene.analysis.standard StandardAnalyzer)
(org.apache.lucene.document Document Field Field$Store Field$Index)
(org.apache.lucene.index IndexReader IndexWriter IndexWriter$MaxFieldLength)
(org.apache.lucene.store NIOFSDirectory RAMDirectory)
(org.apache.lucene.util Version))
(:gen-class))
和主要功能正是如此定義(現在):
(defn -main [& args]
(print "DAFUQ?"))
對於所有的意圖和目的,這應該工作:如果我創建一個存根應用leiningen app new
它工作正常。但不是與上述。
如果我至少得到某種堆棧跟蹤(即我可以調查的東西),我會感覺很好,但沉默正在殺死我。
任何人有任何想法?
非常感謝。
爲了能夠通過'java -jar'運行,你需要一個具有MainClass屬性的清單。 AFAIK uberjar不會自動執行此操作。 – Alex 2013-03-19 18:13:40
我認爲這是uberjar的全部觀點。如果是這種情況,那麼我會希望殘留的'leiningen app new'不起作用,但它確實:我可以用它構建一個uberjar,並用'java -jar'調用結果。看看它爲我的應用程序構建的jar,有一個清單,它包含一個'Main-Class:spelunker.core'行,所以不是這樣。 (還是)感謝你的建議。 – TreeRex 2013-03-19 18:19:49
是的,事實證明,您不必像其他人那樣顯式設置Main-Class清單屬性。在那種情況下,我不確定會發生什麼。 – Alex 2013-03-19 18:23:23