2010-08-02 57 views
5

我有一個hello.clj如下。如何在運行由'lein uberjar'創建的jar時設置類路徑?

(ns hello) 
(defn hi [] (println "HI")) 

通常,我可以在main.clj中使用這個函數,如下所示。 hello.clj位於包含main.clj的同一目錄中。類路徑包括。 (當前路徑)。

(use 'hello) 
(hi) 

如何使用hello.clj作爲'lein uberjar'?

我用'lein new myproject; lein deps'來獲得以下結構。

 
. 
|-- README 
|-- classes 
| `-- myproject 
|-- lib 
| |-- clojure-1.2.0-beta1.jar 
| |-- clojure-contrib-1.2.0-beta1.jar 
| `-- lucene-core-3.0.2.jar 
|-- project.clj 
|-- src 
| `-- myproject 
|  `-- core.clj 
`-- test 
    `-- myproject 
     `-- test 
      `-- core.clj 

project.clj如下。

(defproject myproject "1.0.0-SNAPSHOT" 
    :description "FIXME: write" 
    :dependencies [[org.clojure/clojure "1.2.0-beta1"] 
       [org.clojure/clojure-contrib "1.2.0-beta1"] 
       [org.apache.lucene/lucene-core "3.0.2"]] 
    :main myproject.core)  

而core.clj如下。

(ns myproject.core 
    (:gen-class)) 

(use 'hello) 

(defn test1 [] (println "hello")) 

(defn -main [& args] 
    (do 
    (println "Welcome to my project! These are your args:" args) 
    (test1) 
    (hi))) 

現在,我在哪裏把hello.clj? 我試圖將其複製到myproject/src目錄並運行uberjar來獲取jar。但是,運行jar會導致此錯誤消息。

 
prosseek:myproject smcho$ java -jar myproject-1.0.0-SNAPSHOT-standalone.jar a d d 
Exception in thread "main" java.lang.ExceptionInInitializerError 
Caused by: java.io.FileNotFoundException: Could not locate hello__init.class or hello.clj on classpath: (core.clj:0) 
... 
  • 可能是什麼問題?錯誤消息說hello.clj不在類路徑上。但是,如何用'lein uberjar'設置類路徑?

我上傳了項目here

回答

8

你把hello.clj在src/myproject的所以它的NS應該myproject.hello。有了這個文件結構,我希望hello.clj可以說(ns myproject.hello),core.clj可以說(use 'myproject.hello)

當我做這些改變,我得到:

$ java -jar myproject-standalone.jar a b c 
Welcome to my project! These are your args: (a b c) 
hello 
HI 
+0

是的,它的工作原理!非常感謝。 – prosseek 2010-08-02 20:57:46

+1

你想要做什麼(ns hello)被稱爲單段命名空間。儘管當你剛剛進入Clojure-land時它可以正常工作,但是一旦執行了AOT以便可以作爲uberjar啓動,myproject.core就會變成Java字節碼,並且由於它沒有Java包,因此無法訪問hello名稱空間。 – technomancy 2010-08-13 17:55:31

0

clj應該在你的project-root/src裏面。有了它,它應該工作。有關類似項目的示例,請參閱leiningen項目。柳葉刀命名空間是內源:

http://github.com/technomancy/leiningen/tree/master/src/

+0

我誤解你的問題有點:)是的,如果你有興趣,使爲hello項目的一部分,是的,你把它裏面。/src/myproject和declar ethe命名空間作爲myproject.hello。但是如果你正在使用另一個項目中的另一個命名空間(比如leiningen中使用的lancet),那麼將hello.clj放入其自己的命名空間並在/src下添加的方法也可以。 – 2010-08-03 03:14:38