簡體   English   中英

Clojure和Java在現實世界中互操作

[英]Clojure and Java interop in a real world

我正在考慮開始使用(不玩)Clojure。 有沒有有用的指南? 我不是在詢問lein,javac或任何其他“小型”手動工具。 我需要知道如何在同一個項目中使用eclipse中的Java和Clojure源代碼。 如何在沒有編譯錯誤的情況下讓他們互相調用? 如何配置maven? 如何建立完全富有成效的開發環境? 現在甚至可能嗎? 哪些插件可能有用? 從哪兒開始?

我有一個完全正常的生產設置,包括Eclipse,Maven和Clojure,目前工作得非常好。 希望它有助於作為Java IDE中良好的多語言設置的一個例子。

我沒有使用leiningen - 根本沒有反對lein - 它在純粹的Clojure / CLI世界中非常漂亮和理想。 但是我發現使用IDE可以更好地使用純Maven在多語言Java + Clojure環境中工作,因為工具集成要好得多。 此外,從生態系統/受眾/社區的角度來看,如果您希望來自Java世界的人能夠構建您的源代碼,那么如果您直接使用Maven,則會減少混亂。

這是我的設置:

  • Eclipse 4.2作為主IDE
  • 逆時針 Eclipse插件 - 非常好,負責REPL,Clojure編輯等。
  • Maven用於管理所有項目(我主要使用內置的Eclipse Maven集成,但偶爾也會使用CLI版本)
  • cljunit用於使JUnit測試能夠在項目的Clojure部分上運行
  • Github / Travis CI用於SCM和持續集成,使用Eclipse中內置的EGit團隊提供程序訪問

實際上我如何管理/設置項目本身:

  • 我使用Maven配置所有內容,使用標准的Maven目錄布局。 Polyglot Java + Clojure項目通常同時具有src/main/javasrc/main/clojure
  • 與任何其他Java庫一樣,Clojure只是一個Maven依賴項。
  • 我將Clojure源目錄放入Maven設置中的資源目錄中。 這意味着.clj文件捆綁在任何jar中,並且可以在運行時動態加載/運行。
  • 我通常像往常一樣使用public static void main(...)在Java端創建入口點,但很快調用Clojure代碼。 請參閱此博客文章,了解如何從Java調用Clojure

最后一些編碼提示多語言Java + Clojure

  • 我發現Java對於低級數據結構,庫和算法更好,而Clojure更適合將事物集成在一起並“粘合”代碼。
  • 調用Java的Clojure通常比其他方式更容易/更優雅。 它也有意義,因為你通常希望依賴關系以這種方式流動(更高級代碼調用更低級代碼)
  • 如果你使所有的Java類都是不可變的,那么它們在Clojure世界中只需要很少的努力就能很好地發揮作用。
  • 有時值得讓一個或多個Java類實現一些Clojure接口,例如clojure.lang.IFn 這樣,您的Java對象就可以充當Clojure代碼中的第一類函數。

這是一個混合Java和Clojure源的示例項目:

我還寫了一個小型庫( clojure-utils ),其中包含一些用於從Java調用Clojure的示例代碼,您可能會發現它很有用。

盡管你對萊寧根有所了解,但我建議你去看看。 Leiningen支持Java編譯,因此在一個項目中組合java和clojure源不是問題。

Counterclockwise插件,Eclipse的clojure插件,可以與leiningen項目文件(project.clj)一起使用。 因此,在Eclipse中,您可以通過在project.clj中定義正確的內容來為您處理依賴關系管理和Java編譯,而無需單獨安裝leiningen或從命令行執行命令。

在project.clj中設置:java-source-paths ,例如:

:java-source-paths ["src/main/java"] 

在包src / main / java中放一個類Foo:

package main.java;

public class Foo {
    public static final String value = "Michiel";
}

在clojure源文件中的某處定義此函數,並在調用時打印“Michiel”:

(defn foo
  "I don't do a whole lot."
  []
  (println (main.Foo/value)))

進一步閱讀:

您也可以嘗試“Funky”框架。 它將完全分離你的Clojure和Java代碼。 只需看看https://github.com/windler/Funky

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM