2010-06-26 8 views
16

मुझे थोड़ा मूर्खतापूर्ण महसूस हो रहा है, लेकिन मुझे संकलन करने के लिए क्लोजर हैलो वर्ल्ड नहीं मिल सकता है।क्लोजर संकलन?

निर्देशिका संरचना:

hello-world/ 
    clojure-1.1.0.jar 
    build/ 
    classes/ 
    src/ 
    test/ 
     hello.clj 

hello.clj:

(ns test.hello 
    (:gen-class)) 

(defn -main [& args] 
    (println "Hello" (nth args 0))) 

इंटरेक्शन:

$ cd hello-world 
[hello-world]$ java -cp ./clojure-1.1.0.jar:./build/classes:./src clojure.main 
Clojure 1.1.0 
user=> (require 'test.hello) 
nil 
user=> (test.hello/-main "there") 
Hello there 
nil 
user=> (compile 'test.hello) 
java.io.IOException: No such file or directory (hello.clj:2) 
user=> *compile-path* 
"classes" 
user=> (doseq [p (.split (System/getProperty "java.class.path") ":")] (println p)) 
./clojure-1.1.0.jar 
./build/classes 
./src 
nil 

तो मैं लोड और आरईपीएल से फ़ाइल कॉल कर सकते हैं, लेकिन यह 'नहीं करता है टी संकलन।

clojure.org के अनुसार, संकलन की जरूरत है

  • नाम स्थान classpath-रिश्तेदार फ़ाइल पथ से मेल खाना चाहिए - जाँच
  • * संकलन पथ * classpath पर होना चाहिए -
  • जाँच: जनरल श्रेणी के तर्क को एनएस फॉर्म -

मुझे this post from a year back मिला, जहां तक ​​मैं कह सकता हूं कि मैं बिल्कुल वही कर रहा हूं, लेकिन यह काम नहीं करता है।

मुझे क्या याद आ रही है?

सिस्टम: ओएस एक्स 10.6, जावा 1.6.0, Clojure 1.1

+0

ऐसा लगता है कि मैं अपना खुद का जवाब स्वीकार नहीं कर सकता, इसलिए मुझे प्रश्न तब तक खुलना होगा जब तक कोई और झटके न दे। –

+0

यह भी ध्यान देने योग्य है कि आप शायद ही कभी AOT संकलन क्लोजर कोड की आवश्यकता है। क्लोजर कोड संकलित किए बिना ठीक चलाएगा, और यही वह तरीका है जिसे आपको इसे चलाना चाहिए। कुछ विशिष्ट क्लोजर जावा इंटरऑप विशेषताएं वास्तव में * आवश्यक * है कि आपका कोड एओटी संकलित हो, लेकिन यदि आप उन सुविधाओं का उपयोग नहीं कर रहे हैं, तो अपने कोड को संकलित करने से परेशान न करें। यदि आप एक निष्पादन योग्य जार चाहते हैं, तो आप केवल एओटी को एप्लिकेशन चलाने के लिए केवल एक-मुख्य फ़ंक्शन के साथ एक मुख्य फ़ाइल संकलित कर सकते हैं। हालांकि, http://www.assembla.com/spaces/clojure/tickets/315-add-support-for-running--main-namespace-from-clojure-main-without-aot – Rayne

उत्तर

11

आप Leiningen का प्रयोग क्यों नहीं करते? मैन्युअल रूप से संकलित कोड की तुलना में इसका उपयोग करना बहुत आसान है। आप my article का उपयोग परिचय के रूप में कर सकते हैं ...

+0

मैंने बाहरी परियोजनाओं के लिए निर्भरताओं को डाउनलोड करने के लिए इसे संक्षेप में उपयोग किया है, लेकिन अभी तक इसे एक निर्माण उपकरण के रूप में उपयोग करने के तरीके में नहीं देखा गया है। लिंक के लिए धन्यवाद, मैं इसे देख लूंगा। –

+0

अच्छा अवलोकन, लेख के लिए धन्यवाद।शायद समय के बारे में मैं किसी भी निर्माण उपकरण का उपयोग शुरू करना चाहता हूं :) –

+0

लीनिंगेन मेरी मदद नहीं करता है: $ lein test प्रोजेक्ट.क्लोज नहीं मिला, जो परीक्षण – mcandre

20

समझ लिया, वहाँ एक चौथी आवश्यकता है:

  • * संकलन पथ * कार्यशील निर्देशिका JVMs के सापेक्ष हल हो गई है, आम तौर पर निर्देशिका जहां जावा शुरू हुआ है। या आरईपीएल द्वारा: (System/getProperty "user.dir"),

तो यह काम करता है:

user=> (set! *compile-path* "build/classes")  
"build/classes" 
user=> (compile 'test.hello) 
test.hello 
+0

स्पष्टीकरण संशोधित, पहला वाला गलत था। फिक्स वही है। –

+4

मेरे लिए, (सेट! * संकलन-पथ * "।") वर्तमान निर्देशिका में सीएलजे संकलित करने के लिए आवश्यक है। – mcandre

+0

+1 इससे मेरी मदद की ... धन्यवाद! – OscarRyz