【发布时间】:2013-03-19 17:56:35
【问题描述】:
我有一个使用“lein uberjar”构建的小型命令行 Clojure 应用程序。结果 jar 文件在启动时不会调用我的 main 函数,也不会给我任何类型的堆栈跟踪或其他错误情况指示。
% 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 不会自动执行此操作。 -
我认为这就是 uberjar 的全部意义所在。如果是这种情况,那么我希望存根的
leiningen app new不起作用,但它确实可以:我可以用它构建一个 uberjar 并用java -jar调用结果。查看它为我的应用程序构建的 jar,有一个清单,它确实包含一个Main-Class: spelunker.core行,所以不是这样。不过感谢您的建议。 -
是的,事实证明您不必像其他人那样显式设置 Main-Class 清单属性。在那种情况下,我不确定会发生什么。