我的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
我的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
(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
函数并在那里启动了系统。 - Mahsa2java -jar name-of-your-app.jar
project.clj
文件中配置了 main
选项。 - Abhinav Sarkar现在可以通过生成正确的类路径(例如从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] 不确定这是何时引入的