我可以建议将您的程序编译为 uberjar 吗?jar 可以按名称执行,就像您的包装脚本一样,但这样您就不需要额外的包装。
下载最新版本的 leiningen 并创建一个项目$ lein new foo
,然后进入该目录。在开发代码的过程中,您可能希望使用 repl ( $ lein repl
),或调用$ lein run
以从命令行运行它。
编辑 src/foo/core.clj:添加一个用于 AOT 编译的 gen-class 和一个 main 函数。
(ns foo.core
(:gen-class))
(defn -main [& [a]]
(println (format "Hello, %s World!" a)))
编辑 project.clj 并将其作为主类:
(defproject foo "0.0.1"
:description "FIXME: write description"
:dependencies [[org.clojure/clojure "1.4.0"]]
:main foo.core)
现在编译 uberjar 并使其可执行:
$ lein do clean, compile, uberjar ; chmod +x ./target/foo-0.0.1-standalone.jar
可执行 jar 位于 target/ 目录中,您现在可以像任何其他可执行文件一样按名称调用它:
$ cd target
$ mv foo-0.0.1-standalone.jar foo
$ ./foo crazy
Hello, crazy World!
$ ./foo
Hello, null World!
其他方法
Leiningen w/shebang
使用 leiningen shebang 风格http://charsequence.blogspot.com/2012/04/scripting-clojure-with-leiningen-2.html
ClojureScript + V8 -> 带有 shebang 的 js
Clojure 并不是命令行脚本的最佳选择,因为 JVM 有预热时间。ClojureScript + V8 引擎被提出(在 Rich Hickey 的 ClojureScript 就职公告中)作为脚本编写的更好解决方案。这是带有详细示例的博客文章http://mmcgrana.github.com/2011/09/clojurescript-nodejs.html这是一个 StackOverflow 答案,展示了如何在 shebang 中使用节点:是否可以运行 Node.js不调用“节点”的脚本?
但是,由于您的目标似乎是没有编译步骤,因此您可能需要编写一个脚本,您将在 shebang 中使用该脚本,在运行之前从 cljs 构建 js。在这种情况下,您将再次遇到相同的 JVM 启动时间问题,因此使用上面链接的 Debasish 更简单的方法可能会更好。