【问题标题】:Clojure app built with lein uberjar not launching使用 lein uberjar 构建的 Clojure 应用程序未启动
【发布时间】: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 清单属性。在那种情况下,我不确定会发生什么。

标签: clojure leiningen


【解决方案1】:

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

【讨论】:

  • 哇...做到了。我觉得自己像个白痴。我实际上在我的机器上的字符串中有一个"\n",并认为这会导致刷新,但事实并非如此。更改为 println 强制刷新。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2019-01-21
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
相关资源
最近更新 更多