使用lein uberjar构建的Clojure应用程序未启动
我有一个小的命令行Clojure应用程序,它是用“lein uberjar”构建的。结果jar文件在启动时不会调用我的主函数,也不会给我任何类型的堆栈跟踪或错误条件的其他指示使用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/
% 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的全部要点。如果是这样的话,那么我认为stubbedleiningen应用程序new
不会工作,但它确实工作了:我可以用它构建一个uberjar,并用java-jar
调用结果。看看它为我的应用程序构建的jar,有一个清单,它确实包含一个主类:spelunker.core
行,所以不是这样。谢谢你的建议。是的,事实证明你不必像其他人那样显式地设置主类清单属性。那样的话,我不知道会发生什么。哇。。。成功了。我觉得自己像个白痴。实际上,我的机器上的字符串中有一个“\n”
,我认为这会导致刷新,但事实并非如此。更改为println
强制刷新。非常感谢。
(defn -main [& args]
(print "DAFUQ?"))