2011-12-02 90 views
2

My Leiningen項目需要一些我試圖從Clojure訪問的外部Java類。在Leiningen項目中使用Java代碼

起初,我試圖把類文件中MY_PROJECT /資源/,因爲該目錄是在其上運行

lein classpath 

但是證實classpath中,我無法訪問即使從簡單的玩具的Java類Clojure駐留在所述目錄中。爲了讓事情儘可能簡單,我的玩具類沒有包裝聲明。我的第二種方法是在我的project.clj中添加一個:java-source-path鍵,但我又一次被失敗所觸發(與上面相同的行爲,我無法從Clojure REPL訪問該類)。

我在哪裏錯了?

回答

2

夫婦的事情,可能是錯誤的:

您使用的.class文件或.java文件? java-source-path用於源文件,即.java文件。 .java文件需要在可以加載之前進行編譯。

此外,java類需要導入或限定在clojure代碼中的完整軟件包名稱。

如果可能,並且您的java代碼不直接綁定到clojure的東西,最簡單的方法是將您的java文件編譯並捆綁到一個jar中,然後添加到您的leiningen項目的依賴項中。

+0

.class和.java文件都位於resources /和java sources目錄中(java /在我的情況下)。無論如何,因爲資源/ *實際上在類路徑中,所以我期望Java類可以很容易地從Clojure中獲得(我的Java類沒有任何包聲明,因此我希望它們在不導入任何內容的情況下可用)。 – Christian

+0

我不會指望沒有包的類只能自動遍歷,但我不知道java類加載器或編譯器的細節。 Clojure本身需要顯式導入java.lang之外的任何內容(即使clojure.lang類不會自動導入)。如果沒有更好的建議出現,我會嘗試爲這些類設置軟件包(java文件和clojure代碼中的import語句的相應目錄) –

+1

編輯的時限之外:如果您的類沒有包,我想clojure代碼中的普通'(import'YourClass)'應該可以工作,儘管在clojure中至少推薦使用2層包,因爲我現在不記得技術原因。 –

0

將java源代碼放入路徑後,您是否運行lein compile?

+0

是的,它編譯正確。然而,Joost解決了我的問題(這是一個缺少的導入)。 – Christian

0

在您的.project文件中爲您的項目指定:java-source-paths as [「java」]而不是「java」如果「java」目錄是您將java源文件放入您的位置項目的目錄。

如果您在.project文件中指定了:java-source-paths和:main權限,那麼運行'lein run'應該在實際運行之前自動編譯java源代碼。

來源:https://github.com/technomancy/leiningen/blob/master/doc/MIXED_PROJECTS.md

  1. 我犯了這個錯誤,並一直想知道我在做什麼錯。 Chas Emerick Clojure關於數據庫章節中關於休眠的編程手冊需要稍微更新一下。
0

在你的project.clj中,你的資源路徑是否有關鍵字?你說你有java-source-paths關鍵字,但是那些用於.java文件,當你的項目被構建/運行時需要被編譯。在您的project.clj文件中添加此

:resource-paths ["relative/path/to/your/classes/folder" "relative/path/to/other/classes"] 

這將使您的項目在您的命名空間聲明import語句引用您的各種類。

(ns my.project.name-space 
    (:require [clojure.core.async :as async]) 
    (:import MySuperAwesomeClass)) 
相關問題