使用 leiningen 别名指定 JVM 标志

Pet*_*ull 6 clojure leiningen

如何指定 JVM 标志以便它们仅适用于project.clj文件中的一个别名?

具体来说,我想尝试Clojure 1.8.0 中的内置服务器功能。

我可以用 uberjar 和命令来做到这一点:

java -Dclojure.server.interactive="{:port 8411 :accept srv.action/process}" -jar target\uberjar\srv-0.1.0-SNAPSHOT-standalone.jar
Run Code Online (Sandbox Code Playgroud)

但我希望我可以-D...从 lein 别名中设置它。我试过这个

:aliases {
        "serve" [:jvm-opts ["-Dclojure.server.interactive={:port 8411 :accept srv.action/process}"] "run"]
}
Run Code Online (Sandbox Code Playgroud)

但我得到

java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.lang.String
Run Code Online (Sandbox Code Playgroud)

是否有可能做到这一点?我在 Java 1.8.0_92 Java HotSpot(TM) 64 位服务器 VM 上使用“Leiningen 2.6.1”

小智 8

Leiningen 配置文件绝对是做到这一点的方法。在您的情况下,您可以使用任何常用选项定义配置文件:jvm-opts。在您的 profile.clj 中包含类似于以下内容的内容:

:profiles {:clj-server {:jvm-opts ["-Dclojure.server.interactive={:port 8411 :accept srv.action/process}"]}}
Run Code Online (Sandbox Code Playgroud)

然后您可以通过with-profile告诉 leiningen 您希望使用此配置文件

lein with-profile clj-server run
Run Code Online (Sandbox Code Playgroud)

但是,这只会使用新配置文件中指定的选项。如果您希望在默认配置文件(开发、测试等)之外激活新配置文件,您需要在配置文件前加上+.

lein with-profile +clj-server run
Run Code Online (Sandbox Code Playgroud)

如果你像我一样懒惰,你可以定义一个别名来使用这个新定义的配置文件来运行不同的任务:

:aliases {"clj-server-run" ["with-profile" "+clj-server" "run"]}
Run Code Online (Sandbox Code Playgroud)

然后就像调用一样简单lein clj-server-run

希望这会有所帮助。我真的建议通读提供的 leiningen 文档以及它非常有用。