使用lein uberjar构建的Clojure应用程序未启动

使用lein uberjar构建的Clojure应用程序未启动,clojure,leiningen,Clojure,Leiningen,我有一个小的命令行Clojure应用程序,它是用“lein uberjar”构建的。结果jar文件在启动时不会调用我的主函数,也不会给我任何类型的堆栈跟踪或错误条件的其他指示 % 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/

我有一个小的命令行Clojure应用程序,它是用“lein uberjar”构建的。结果jar文件在启动时不会调用我的主函数,也不会给我任何类型的堆栈跟踪或错误条件的其他指示

% 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))
主要功能的定义如下(目前):

无论出于何种目的,这都应该有效:如果我使用
leiningen app new
创建一个存根应用程序,它就可以正常工作。但上述情况并非如此

如果我至少得到了某种堆栈跟踪(即,我可以调查的东西),我会感觉很好,但这种沉默正在折磨着我

有人有什么想法吗


非常感谢。

您在退出之前没有冲水。在
-main
中将
print
更改为
println
,换行符将自动刷新,或者在打印后显式刷新。

要能够通过
java-jar
运行,您需要一个带有MainClass属性的清单。AFAIK uberjar不会自动执行此操作。我认为这就是uberjar的全部要点。如果是这样的话,那么我认为stubbed
leiningen应用程序new
不会工作,但它确实工作了:我可以用它构建一个uberjar,并用
java-jar
调用结果。看看它为我的应用程序构建的jar,有一个清单,它确实包含一个
主类:spelunker.core
行,所以不是这样。谢谢你的建议。是的,事实证明你不必像其他人那样显式地设置主类清单属性。那样的话,我不知道会发生什么。哇。。。成功了。我觉得自己像个白痴。实际上,我的机器上的字符串中有一个
“\n”
,我认为这会导致刷新,但事实并非如此。更改为
println
强制刷新。非常感谢。
(defn -main [& args]
  (print "DAFUQ?"))