Clojure:如何从jar文件中运行我的主函数?

14

我的Clojure应用已经被打包成了一个jar文件。我是这样启动它的:

java -cp lib/clojure-1.2.0.jar:my-app.jar clojure.main -e "(use 'foo.main)(-main)"

这是启动我的应用程序的唯一方法吗?具体来说,我希望看到像这样简单的东西:

java -cp lib/clojure-1.2.0.jar:my-app.jar clojure.main foo.main

编译它:http://alexott.net/en/clojure/ClojureLein.html - 使用Leiningen,http://clojure.org/compilation - 不使用它。 - ffriend
3个回答

17
使用
(ns foo.main
  (:gen-class)

在你的主源文件中生成命名空间包限定类文件。添加。
:main foo.main
:manifest {"Class-Path" "lib/clojure-1.2.0.jar"}

将以下代码添加到你的Leiningen项目文件中。在执行"lein jar"命令后,你可以使用JAR包内嵌的元数据来启动应用程序:

java -jar foo-YOURVERSION.jar

这对我有用。 我不需要 :manifest。 另外,我必须添加 :aot [foo.main] 以消除在 :main 上的警告。 在 foo.main 中, 我添加了一个 -main 函数并在那里启动了系统。 - Mahsa2

5
如果您使用Leiningens的uberjar任务打包应用程序,那么您只需要运行以下命令:
java -jar name-of-your-app.jar

只要您在 project.clj 文件中配置了 main 选项。 - Abhinav Sarkar

2

现在可以通过生成正确的类路径(例如从Leiningen)来实现此操作 [1]:

java -cp $(lein classpath) clojure.main -e "(do '(require '[clojure.string]) (println (clojure.string/join \" \" [1 2 3])))"

或者从一个uberjar中:

java -cp my_uberjar.jar clojure.main -e "(do '(require '[clojure.string]) (println (clojure.string/join \" \" [1 2 3])))"

您还可以使用此库从另一个Clojure进程本身(例如repl)执行类似的操作 https://github.com/clojure/java.classpath

(clojure.java.shell/sh "java" "-cp" (clojure.string/join ":" (map #(.toString %) (clojure.java.classpath/classpath) "clojure.main" :in (pr-str '(do (require '[my.namespace]) ([my.namespace/my-main)))))

[1] 不确定这是何时引入的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接