【发布时间】:2017-11-28 14:03:03
【问题描述】:
我目前运行一个我通过调用编写的简单 cli:lein run my-cli-command arg --option
如何在不需要包含 lein run 的情况下调用我的命令?这就是我所追求的:my-cli-command arg --option
我是否需要将其转换为二进制文件或可执行文件,如果需要如何转换?
【问题讨论】:
我目前运行一个我通过调用编写的简单 cli:lein run my-cli-command arg --option
如何在不需要包含 lein run 的情况下调用我的命令?这就是我所追求的:my-cli-command arg --option
我是否需要将其转换为二进制文件或可执行文件,如果需要如何转换?
【问题讨论】:
据我所知,没有办法只运行my-cli-command arg --option。
您可以通过创建 Java 存档来消除 lein:
lein uberjar
然后像运行其他 jar 一样运行该 jar:
java -jar target/my-cli-command-standalone.jar arg --option
uberjar 将根据您在project.clj 中对项目的名称命名该 jar,并将创建一个依赖外部依赖项的 jar,以及一个不依赖外部依赖项的 jar (standalone)。
然后,正如@gary 指出的那样,您可以将java - jar ... 命令粘贴在 .bat 文件中,随意命名,然后直接运行 bat。我的bat-Fu 很弱,但可能有一种方法可以将参数传递给 bat 并将它们传递给 jar,这样您就不需要对参数进行硬编码。
【讨论】:
java -jar target/my-cli-command-standalone.jar <arg 1> <arg 2>
我没用过,但我知道inlein 存在,它看起来像你需要的。
Inlein 是运行 Clojure 脚本的最简单、最快的方法。您只需要内联您的依赖项,添加一个 shebang 行,并使脚本文件可执行。
还有一个最小的例子:
#!/usr/bin/env inlein
'{:dependencies [[org.clojure/clojure "1.8.0"]]}
(println "hello world!")
【讨论】:
从 Clojure 1.9 开始,有新的 CLI 工具!安装见this guide。你可以像这样创建一个可执行脚本:
#!/usr/local/bin/clojure
(println "Hello World! from" *ns*)
(require '[clojure.walk :as walk])
(walk/postwalk-demo {:woo ::yeah})
然后使脚本可执行并执行:
$ chmod +x my_script
$ ./my_script
Hello World! from #object[clojure.lang.Namespace 0x1ebea008 user]
Walked: :woo
Walked: :user/yeah
Walked: [:woo :user/yeah]
Walked: {:woo :user/yeah}
启动时间似乎也有所改善。在最近的 MBP 上运行一个简单的脚本(只打印一个字符串)需要一秒钟多一点的时间:
time ./hello
Hello World!
./hello 1.51s user 0.12s system 184% cpu 0.887 total
【讨论】:
clojure-mode 中!
您可以按照https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable 中的说明在 shell 脚本中使用“二进制有效负载”
基本上,您可以将一个 shell 脚本和您的 uberjar 连接到一个 shell 脚本文件中,并在脚本中执行 java,将该脚本指定为类路径上的 jar 文件 - 该示例来自链接的帖子:
将你的运行脚本保存在stub.sh:
#!/bin/sh
MYSELF=`which "$0" 2>/dev/null`
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
java=java
if test -n "$JAVA_HOME"; then
java="$JAVA_HOME/bin/java"
fi
exec "$java" $java_args -jar $MYSELF "$@"
exit 1
然后将它与您的 uberjar 连接起来:
cat stub.sh my-cli-command-uberjar.jar > my-cli-command && chmod +x my-cli-command
现在可以直接运行了:
./my-cli-command args...
还有一个 lein 插件可以自动化这个过程:lein-binplus
【讨论】: