2012-02-19 30 views
2

我正在開發一些使用REPL的polyglot Java + Clojure代碼(在Eclipse中使用CounterClockwise和Maven)。在這種情況下,只需在REPL中加載源並開始與代碼交互即可。在Eclipse中爲REPL和應用程序部署都設置Clojure代碼

但是,我最終希望能夠以.jar文件或類似方式分發和部署代碼,以便它可以作爲獨立應用程序運行。在這種情況下,代碼需要作爲具有適當的main(...)函數的Java應用程序來執行。我希望從Maven pom.xml文件乾淨地構建。

到目前爲止,我有代碼工作,以便我有一個-main函數,當我在REPL中使用Clojure時不會調用,但應該在打包/部署爲jar時調用。這似乎有效,但我不確定這是否代表最佳方法。

理想情況下,我想一切都在順利工作:

  • 逆時針REPL
  • 標準的Maven構建過程,導致完全打包/部署的jar文件

什麼是建立一個Clojure代碼庫的最佳實踐,以便它可以很容易地在REPL中使用並構建一個獨立的應用程序?

回答

3

這可能與REPL體驗造成影響的唯一的事情是,當在REPL需要的命名空間應該不會運行頂層側effecty的說法,然而,其中一個可能希望有一個命名空間發生(可能間接地)在REPL中需要。很明顯,這只是一個壞主意(如果似乎像某種方式的有用安排 - 例如對於Leiningen的複雜鉤子 - 命名空間應該可以拆分爲包含定義的名稱空間和帶有副作用代碼的名稱空間)。

運行的應用程序的固有模式將取決於以下類別它落入的:

  1. 主要切入點Clojure中
    1. 不介意的Clojure的代碼AOT編譯
    2. 更喜歡避免AOT
  2. Java的主要切入點(Clojure的東西通過clojure.lang.RT調用)

For 1.1。自然的做法是在應用程序的jar的manifest.mf中使用:gen-class'd命名空間作爲Main-Class。然後你可以使用java -jar(如果它是一個überjar/獨立的罐子)/ java -cp <app's cp> app.main來啓動它。如果您在project.clj中指定:main財產,Leiningen可以幫助您解決此問題;看到它是如何最流行的構建工具和其選擇支持這種方法(據我所知)沒有吸引批評,人們或許可以稱之爲地道。 Maven可以做同樣的與平時pom.xml咒語指定主類。

For 1.2。,你可以做Leiningen做的事情:提供一個叫做clojure.main的包裝,其中包含-e "(use 'app.core)(-main)"作爲參數。

爲2,沒有什麼特定的Clojure左右推出。

+0

謝謝米哈爾 - 非常有用和偉大的查看所有可行的選項列舉! – mikera 2012-02-19 05:00:56

+0

不用擔心。祝賀[clojure]徽章! :-) – 2012-02-19 05:55:55

+0

謝謝....雖然不知道如果我應得,但仍然有很多東西要學! – mikera 2012-02-19 07:33:13

相關問題