2010-08-02 5 views
5

मेरे पास एक हैलो.क्लज है।'लीन uberjar' से बने जार चलाने के दौरान कक्षापथ कैसे सेट करें?

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

आम तौर पर, मैं इस समारोह का मुख्य रूप से main.clj से उपयोग कर सकता हूं। Hello.clj उसी निर्देशिका में है जिसमें main.clj शामिल है। और कक्षा में शामिल हैं। (वर्तमान पथ)।

(use 'hello) 
(hi) 

'lein uberjar' के लिए मैं इस hello.clj का उपयोग कैसे कर सकता हूं?

मैंने 'लीन न्यू मायप्रोजेक्ट' का उपयोग किया; निम्नलिखित संरचना प्राप्त करने के लिए लीन 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 चलाने की कोशिश की। लेकिन, जार चलाने से यह त्रुटि संदेश होता है।

 
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) 
... 
  • क्या गलत हो सकता है? त्रुटि संदेशों का कहना है हैलो.क्लज क्लास पथ पर नहीं है। लेकिन, 'लीन uberjar' के साथ classpath कैसे सेटअप करें?

मैंने प्रोजेक्ट here अपलोड किया।

उत्तर

8

आप hello.clj src/MyProject के नीचे रखा तो यह एनएस myproject.hello होना चाहिए। इस फ़ाइल संरचना के साथ, मैं हैलो.क्लज (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

+1

आप जो करने की कोशिश कर रहे थे (एनएस हैलो) को एकल-सेगमेंट नेमस्पेस कहा जाता है। जब आप क्लोजर-भूमि में होते हैं, तो यह ठीक काम करता है, एक बार जब आप एक uberjar myproject.core के रूप में लॉन्च करने योग्य होने के लिए एओटी करते हैं तो जावा बाइटकोड बन जाता है और हैलो नेमस्पेस पर नहीं मिल सकता है क्योंकि इसमें जावा पैकेज नहीं है। – technomancy

0

क्लोज आपके प्रोजेक्ट-रूट/src के अंदर होना चाहिए। इसके साथ यह काम करना चाहिए। एक समान परियोजना के उदाहरण के लिए, लीनिंग परियोजना देखें। लैंसेट नाम स्थान src अंदर है:

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

+0

मैं आपके सवाल का एक सा गलत समझा :) हाँ, अगर आप अपने प्रोजेक्ट के हिस्से के रूप हैलो बनाने के लिए रुचि रखते हैं, हाँ, आप इसे अंदर डाल दिया।/src/myproject और myproject.hello के रूप में नामस्थान को घोषित करें। लेकिन यदि आप किसी अन्य प्रोजेक्ट (जैसे लेंसिंग में इस्तेमाल किए गए लैंसेट) से दूसरे नामस्थान का उपयोग कर रहे हैं, तो हैलो.क्लज को अपने नामस्थान में डालने का उपरोक्त दृष्टिकोण और /src के तहत जोड़ना ठीक काम करता है। –

संबंधित मुद्दे