我正在使用REPL开发一些多语言Java + Clojure代码(在Eclipse中使用CounterClockwise和Maven)。在这种情况下,只需在REPL中加载源并开始与代码交互即可。
但是,我最终希望能够在.jar文件或类似文件中分发和部署代码,以便它可以作为独立应用程序运行。在此上下文中,代码需要作为具有适当main(...)
函数的Java应用程序执行。我希望从Maven pom.xml文件中完全构建它。
到目前为止,我已经有了代码工作,所以我有一个-main函数,当我在REPL上使用Clojure时不会被调用,但是当打包/部署为jar时应该调用它。这似乎有效,但我不确定这是否代表最佳方法。
理想情况下,我希望一切顺利进行:
设置Clojure代码库的最佳做法是什么,以便可以在REPL中轻松使用并构建独立应用程序?
答案 0 :(得分:3)
唯一可能干扰REPL体验的是一个顶级的副作用语句,当REPL需要名称空间并且发生在一个人们可能希望拥有的命名空间(可能是间接的)时,它不应该运行REPL要求。显然,这只是一个坏主意(如果似乎在某种程度上是一种有用的安排 - 例如,对于Leiningen的复杂钩子 - 命名空间应该被分成包含定义的命名空间和命名空间副作用代码)。
运行应用程序的自然模式取决于它属于以下哪个类:
clojure.lang.RT
调用Clojure的东西) 1.1。自然的方法是在应用程序的jar :gen-class
中使用Main-Class
'd命名空间作为manifest.mf
。然后你可以使用java -jar
(如果它是一个überjar/独立jar)/ java -cp <app's cp> app.main
来启动它。如果您在:main
中指定project.clj
属性,Leiningen会对此有所帮助;看看它是最受欢迎的构建工具,它支持这种方法的选择(据我所知)不会引起任何批评,人们可能会称它为惯用语。 Maven可以使用通常的pom.xml
咒语指定主类。
对于1.2。,你可以做Leiningen所做的事情:提供一个包含clojure.main
-e "(use 'app.core)(-main)"
的包装器作为参数。
对于2.,没有任何关于发布的特定Clojure。