2013-03-19 45 views
2

我有一個使用「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它工作正常。但不是與上述。

如果我至少得到某種堆棧跟蹤(即我可以調查的東西),我會感覺很好,但沉默正在殺死我。

任何人有任何想法?

非常感謝。

+0

爲了能夠通過'java -jar'運行,你需要一個具有MainClass屬性的清單。 AFAIK uberjar不會自動執行此操作。 – Alex 2013-03-19 18:13:40

+0

我認爲這是uberjar的全部觀點。如果是這種情況,那麼我會希望殘留的'leiningen app new'不起作用,但它確實:我可以用它構建一個uberjar,並用'java -jar'調用結果。看看它爲我的應用程序構建的jar,有一個清單,它包含一個'Main-Class:spelunker.core'行,所以不是這樣。 (還是)感謝你的建議。 – TreeRex 2013-03-19 18:19:49

+0

是的,事實證明,您不必像其他人那樣顯式設置Main-Class清單屬性。在那種情況下,我不確定會發生什麼。 – Alex 2013-03-19 18:23:23

回答

2

您退出前沒有刷新。將print更改爲println,-main,換行符將自動刷新,否則按照您的打印進行顯式刷新。

+0

哇...這樣做。我覺得自己像個白癡。我實際上在我的機器的字符串中有一個''\ n「',並且認爲這會導致刷新,但它不會。更改爲'println'強制刷新。謝謝! – TreeRex 2013-03-19 18:57:37