2010-07-14 135 views
1

我正在嘗試從簡單的clojure文件創建jar文件的過程。下面是我的Clojure代碼:從clojure文件製作jar文件時發生FileNotFoundException

(ns app.first (:gen-class)) 
(refer 'clojure.core) 
(defn -main [& args] (println "this program worked!")) 

我使用這些說明創建jar文件:http://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips

我看到錯誤「java.io.FileNotFoundException:找不到應用程序/ hello__init.class或應用程序類路徑中的/hello.clj:(NO_SOURCE_FILE:0)「,當我嘗試完成(compile 'app.first)步驟時。

我的嘗試和鏈接的唯一區別是我的文件(first.clj而不是hello.clj)的名稱。

任何人都可以看到我要去哪裏錯了嗎?或者就此而言,我想要做的就是學習如何從clojure文件創建jar,所以如果有人知道更好/更簡單的方法來做到這一點,請告訴我。

+1

注意'refer'形式是不必要的; 'ns'已經爲你做了。 – 2010-07-14 16:34:41

+0

啊,謝謝。我得到的代碼實際上有一條評論,因爲作者也不確定。 – trh178 2010-07-16 12:14:32

回答

2

這是更好地使用Leiningen這樣的任務 - 它允許保持相關性,幷包所有必要的組件集成到jar文件

+0

這工作良好,直到lein uberjar步驟。我最大的問題是(不是來自Java),我無法理解拋出的錯誤和異常。我遵循這個教程http://github.com/technomancy/leiningen/blob/master/TUTORIAL.md。我得到這個異常「java.lang.Exception:名稱衝突,無法首先確定,因爲命名空間:用戶引用:#'clojure.core/first(project.clj:1)」。有任何想法嗎? – trh178 2010-07-14 15:14:14

+0

我把這個標記爲被接受的BC,我最終使用了leiningen,但我想我應該在上面的評論中回答我自己的問題,以瞭解我如何最終得到它的工作。項目名稱不能與類名相匹配(如鏈接教程中所示)。我必須將項目First(在project.clj中)和ns在first/core.clj文件中調用first.core。如果其他人有同樣的問題,希望有幫助... – trh178 2010-07-14 16:18:27

+0

事實上,這不是事實,你必須有其他項目佈局的問題......(事實上,我有興趣知道當你在哪裏得到你的異常 - 我很難猜測它可能來自哪裏)。只要你把你的原始代碼放在src/app/first.clj中,並在你的項目中添加':main app.first'。 clj',無論項目名稱如何,一切都應該工作。特別是,如果該項目本身被稱爲「app.first」,它將工作得很好。 – 2010-07-14 16:40:09

1

我對此很生疏,但是我聽說過其他有類似問題的人。

我認爲記住您指出的類路徑指向您的類樹的根目錄是有幫助的,並且程序包名稱最終會在該樹中創建子目錄。尷尬地說,但我希望你明白這個主意。因此,我認爲你需要做一些類型的體操與創建目錄以匹配「app.first」 - >「/ app/first」層次結構。

對不起,這就像我接近一個明智而有用的答案一樣。希望這可以幫助你。


編輯:

計算機科學的總理指令:它只有當你做一切正常吧!我花了近10分鐘擺弄這個,但終於成功了。

這就是我需要做的就是你的程序進行編譯:

  • 創建一個目錄app,並在那,first.clj與您的代碼。
  • 通過在Clojure中執行(pr *compile-path)檢查*compile-path*。它說「班」。
  • 創建了與app平行的第二個目錄classes
  • 在外殼
  • ,用Clojure做export CLASSPATH=.:./classes
  • ,做(compile 'app.first)

...我發現了一堆類文件的classes。 JARring應該是一個單元。

我發現運行(doc compile)非常有幫助,因爲這提醒我需要有一個目錄來滿足*compile-path*的要求。

+0

我認爲你是對的。我按照上面的鏈接設置了我的目錄。項目/應用程序和項目/類,我的文件位於project/app/first.clj。我認爲問題可能是我從哪裏運行clojure?我試着從項目中運行它......但由於某種原因它無法看到app/first.clj。 – trh178 2010-07-14 14:18:26

+1

編輯回答以顯示操作方法。但是,在這個練習中搗亂了我,我很想同意@Alex Ott :)但是,我個人的偏好是使用支持Clojure的IDE。有Eclipse,NetBeans和IntelliJ Idea的插件。後者可能是「最好的」。 – 2010-07-14 14:53:25

+0

我現在就試試這個。剛剛嘗試leiningen ...工作得很好,直到最後。 lein uberjar命令拋出錯誤「java.lang.Exception:名稱衝突,無法首先定義,因爲namespace:user引用:#'clojure.core/first(project.clj:1)」。 PS:在leiningen使用此鏈接進行教程http://github.com/technomancy/leiningen/blob/master/TUTORIAL.md – trh178 2010-07-14 14:58:40