2011-04-01 10 views
55

नोटअपाचे में Clojure वेब अनुप्रयोग को एकीकृत करने के

को देखते हुए इस ओपी के बारे में दो साल पहले लिखा गया था, के बजाय एक ही सवाल फिर से पूछते हैं, मैं सोच रहा हूँ अगर कदम दर कदम निर्देश मौजूद हैं तो, कि मैं अपाचे में नोएर या अन्य क्लोजर वेब एप्लिकेशन को एकीकृत कर सकता हूं, चाहे वह जेटी, टॉमकैट या कुछ और हो। Django के लिए इसी तरह के निर्देश मौजूद हैं, और मुझे लगता है कि मैं समझता हूं कि पाइथन को अंगूठी के ढांचे के बजाय इंजन के रूप में Django के मामले में चलाया जा रहा है, इसलिए क्लोजर वेब अनुप्रयोगों के साथ चीजें अधिक जटिल होती हैं।

समाप्ति नोट

मैं Clojure से बहुत प्यार करता हूँ, और Compojure एक साफ वेब रूपरेखा की तरह लगता है।

लेकिन जब मैं टॉमकैट जैसे युद्ध के रूप में नियमित एप्लिकेशन सर्वर पर अपना आवेदन तैनात करना चाहता था तो यह सब अलग हो गया। मुझे वास्तव में स्थिर फाइलों और संसाधनों के लिए कस्टम रिंग हैंडलर लिखना पड़ा जो स्थानीय जेटी और टॉमकैट दोनों पर काम करेंगे क्योंकि शेयर हैंडलर नहीं थे, और मुझे मैन्युअल रूप से संदर्भ रूट को प्रीपेड करना पड़ा।

मुझे नकारात्मक आश्चर्य है कि मुझे यह सब कोड लिखना था ताकि सरल वेब एप्लिकेशन कल्पना करने योग्य हो जो जेटी और टॉमकैट दोनों पर चल सके। मैं इस के लिए केवल तीन संभव स्पष्टीकरण है:

  1. कोई भी उत्पादन में जेट्टी के साथ स्थानीय विकास, यानी के अलावा और कुछ के लिए Clojure/Compojure का उपयोग करता
  2. हर कोई एक समर्पित घाट पर Clojure/Compojure क्षुधा तैनात संदर्भ जड़ के बिना (जैसे लोगों Node.js अन्य एप्लिकेशन से करते हैं)
  3. समस्याओं मैं भागा में मैं

इनमें से कौन आपकी राय मामले में है के बारे में पता नहीं था नाकाम करने के लिए एक बहुत आसान तरीका है? या यह कुछ और है?

संपादित करें:

कृपया ध्यान दें कि एक युद्ध फ़ाइल बनाने Maven/Leiningen के साथ एक नहीं चाहती हैं और नहीं मैं क्या मतलब है। मैं सोच रहा हूं कि मुझे टोमकैट के साथ कंपोज़र काम करने के लिए इतना कोड लिखना है, स्थिर फ़ाइल की सेवा और संदर्भ रूट जागरूकता जैसी बुनियादी सामग्री बॉक्स से बाहर काम करना चाहिए।

+4

+1 मैं वास्तव में इस प्रश्न के परिणाम में रूचि रखूंगा। –

+0

मेरे उत्तर से जुड़ा केक प्रोजेक्ट टेम्पलेट विकास के लिए जेटी दोनों और * टोमकैट से ऐप की सेवा करने में शामिल मुद्दों का ख्याल रखता है। – mac

उत्तर

9

लोग गैर-जेटी सर्वलेट कंटेनर में कंपोज़र ऐप्स को तैनात कर रहे हैं।

चेक आउट:

इसके अलावा lein युद्ध की जाँच

+0

स्टैंड के उत्तर पर मेरी टिप्पणी देखें। – futlib

+0

पहले इतनी अज्ञानी होने के लिए खेद है, लीनिंग-युद्ध के साथ लीन-अंगूठी को मिलाकर। लीन-रिंग वास्तव में कमाल है और क्या मैं चाहता हूं: लीन रिंग सर्वर जेटी, लीन रिंग uberwar शुरू करने के लिए एक युद्ध बनाने के लिए जो बिना किसी रूट संशोधन के टॉमकैट में काम करता है। मेरी इच्छा है कि मैवेन के पास ऐसा कुछ था, मैं अब के लिए लीनिंगेन चले गए। – futlib

2

आप Google App इंजिन पर तैनाती कर रहे हैं, यहाँ एक महान ब्लॉग http://compojureongae.posterous.com/

है तुम अब भी कुछ उपयोगी टिप्स भले ही आप GAE करने की तैनाती नहीं कर रहे हैं हो सकता है।

+0

यह उदाहरण अपनी जेटी लॉन्च करने लगता है। तो क्या यह मामला है? – futlib

6

मैं कुछ leiningen-war का उपयोग कर एक सामान्य युद्ध फ़ाइल उत्पन्न करने के लिए सफलता मिली है (यह मानते हुए आप निश्चित रूप से leiningen का उपयोग कर रहे हैं)। यह आपको स्थिर एचटीएमएल, वेब.एक्सएमएल के स्थान और आपके प्रोजेक्ट.क्लज फ़ाइल में अन्य संसाधनों के लिए स्थानों को निर्दिष्ट करने की अनुमति देता है।

मेरे लिए जेनेरिक युद्ध फ़ाइल बनाने के लिए यह बहुत मुश्किल नहीं था कि मैं जेबॉस (टोमकैट को सर्वलेट कंटेनर के रूप में चला रहा था) पर तैनात करने में सक्षम था लेकिन मुझे लगता है कि आपको web.xml प्रारूप से काफी परिचित होना है। मैं अपने स्वयं के web.xml को संलेखन के साथ अधिक आरामदायक हूं ताकि इस दृष्टिकोण को मेरी पसंद के लिए जिम्मेदार ठहराया जा सके।

ऐसा लगता है कि leiningen युद्ध के पीछे व्यक्ति अब lein-ring की सिफारिश की जाती है। मैंने इसे देखना शुरू कर दिया है लेकिन अब तक मैं इसे सामान्य रूप से सामान्य युद्ध फ़ाइल प्राप्त करने में सक्षम नहीं हूं।

मैं मानता हूँ, हालांकि उत्पादन तैनाती के लिए कि लेखांकन एक कमजोरी यहाँ है।

+0

युद्ध फ़ाइल बनाना मेरे लिए कोई समस्या नहीं है, मैं मेवेन का उपयोग कर रहा हूं और यह कोई ब्रेनर नहीं है। लेकिन मेरे सर्वर को एप्लिकेशन सर्वर मुद्दों जैसे स्थिर फ़ाइल सेवा और संदर्भ रूट के साथ काम करने के लिए ट्यून करना, जिसके लिए बहुत अधिक काम की आवश्यकता है। – futlib

11

मैं इस काफी दर्द रहित बनाने के लिए निम्न में से एक संयोजन का उपयोग:

Cake (। Incl तैनाती आदेश)

लाउ जेन्सेन द्वारा विकसित webprojects के लिए एक केक टेम्पलेट।

Vagrant (रूबी वी एम (VirtualBox) प्रबंधन उपकरण है, जो बावर्ची या कठपुतली पर निर्भर करता है)

VPS (Slicehost से)

महत्वपूर्ण हिस्सा है कि लाउ बनाया webdev टेम्पलेट है। वेबदेव फ़ोल्डर ~/.cake/templates में रखा जाना चाहिए। एक नया उस पर का उपयोग आधारित परियोजना बनाने के लिए:

cake new webdev *projectname* 

Pls ध्यान दें कि टेम्पलेट log4j और जावा मेल जो/अगर जरूरत नहीं बाहर रखा जाना चाहिए सकता है। यह आगे लगता है कि आप एनलिव और मूंछ का उपयोग कर रहे हैं लेकिन कंपोज़र/हिचकप में बदलना मामूली है यदि वह आपका जहर है।

टेम्पलेट (आप बस eval server.clj) विकास में घाट से एप्लिकेशन की सेवा का ख्याल रखता है और एक युद्ध के रूप में काम करता है जब बिलाव के तहत चल रहा है। ROOT.war के रूप में सर्वर पर तैनात किए गए रूट्स टोमकैट के तहत रूट समान हैं। सभी स्थैतिक फाइलें संसाधनों में स्थित होनी चाहिए। जेटी वहां से उनकी सेवा करेगा (रिंग फ़ाइल मिडलवेयर के लिए धन्यवाद)। उत्पादन में इन्हें वेबपैप की जड़ में ले जाया जाता है और वहां से टॉमकैट द्वारा सेवा की जाती है (web.xml इसका ख्याल रखता है)।

devbox फ़ोल्डर एक Vagrantfile होता है और आवश्यक cookbooks बिलाव के साथ एक Virtualbox वी एम स्थापित बनाने के लिए। मैं केक का उपयोग करें (इस project.clj में देव संदर्भ की परिभाषा से नियंत्रित किया जाता है) /home/vagrant निर्देशिका के लिए .war फ़ाइल को तैनात करने की। .war फ़ाइल को ROOT.war के रूप में टोमकैट के वेबपैप्स डीआईआर (/var/lib/tomcat6/webapps) में सिम्लिंक किया गया है। Vagrant का उपयोग करने के तरीके के बारे में अधिक जानकारी के लिए कृपया Vagrant site देखें।

यह gist कैसे परियोजना अनुकूलित करने के लिए का एक उदाहरण दिखाता।केक तैनाती कमांड का उपयोग करने के लिए clj।

cake deploy @dev/cake delpoy @prod 

मैं केक webdev टेम्पलेट और इस zip में Vagrant फ़ाइलें एकत्र किया है: उदाहरण के दो संदर्भों @dev और @prod जो आप का उपयोग करने के तैनात कर सकते हैं बनाता है।

+1

'webdev' इस तरह की कुछ चीज़ों पर व्यंजनों की एक स्ट्रिंग में पहला होना चाहिए: https://github.com/klang/cake-recipes – klang

+2

यह एक शानदार जवाब है। – mtnygard

+0

धन्यवाद - किसी कारण से पूछताछकर्ता असहमत प्रतीत होता है :-) – mac

2

मैंने उत्पादन में जारी किया है (अब 6 महीने से अधिक) एक कंपोजर + वाडिन एप्लिकेशन। पैकेजिंग लीन-युद्ध प्लगइन का उपयोग करके किया गया है और मुझे किसी भी बड़ी समस्या का सामना नहीं हुआ।

आवेदन प्रभामंडल का नाम है, एक halo.war फ़ाइल में, संदर्भ/प्रभामंडल है और बिल्ला सर्वर भी हडसन, और एक अन्य कस्टम मेड आवेदन चल रहा है। वाडिन मेरी सभी स्थिर फ़ाइलों को ठीक से, सीएसएस, छवियों को हल कर रहा है ... मैंने मुख्य रूप से उस blog post का उपयोग करने के लिए आवश्यक छोटी गोंद लिखने के लिए उपयोग किया।

एक और नोट पर, मैं Noir पर भी Heroku पर चल रहा हूं और पैकेजिंग और तैनाती के संबंध में कोई समस्या नहीं है, और यह भी उत्पादन में है।

यह सीधे वेब अनुप्रयोगों, हाँ, निश्चित रूप से अपनी Compojure प्रश्न से संबंधित नहीं है, लेकिन Clojure उत्पादन में।

3

मैं Noir उपयोग कर रहा हूँ, एक वेब अंगूठी और Compojure के शीर्ष पर बनाया गया ढांचा।

मैंने lein noir new my-proj का उपयोग कर प्रोजेक्ट बनाया है। तब मैं my-proj/web निर्देशिका बनाया है और बिलाव के लिए विकास के दौरान

project.clj:  
    :compile-path "web/WEB-INF/classes" 
    :library-path "web/WEB-INF/lib" 
    :ring {:handler project.server/handler} 

मैं संदर्भ रूट के रूप में my-proj/web निर्देशिका की स्थापना की है करने के लिए निम्नलिखित लाइनों गयी।

स्थिर फ़ाइल प्रस्तुति के लिए, मैं my-proj/resources/public निर्देशिका के अंतर्गत सामान रख दिया। कोड के माध्यम से फ़ाइलों को पढ़ने (पढ़ने/लिखने) के लिए, :servlet-context अंगूठी अनुरोध शीर्षलेख से उपयोग किया जा सकता है। उपरोक्त सेटिंग्स के साथ, प्रासंगिक पथ होगा: (.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt")। Myfile.txt my-proj/resources के अंतर्गत है।

1

आप एक अंगूठी आधारित सर्वर (compojure, नॉई/lib-नोयर, Luminus, आदि) का उपयोग कर रहे हैं, और एक uberjar के रूप में तैनात करने के लिए चाहते हैं,

"Failed to load Main-Class manifest attribute from your-uberjar.jar" 

से बचने के लिए बस के साथ uberjar बनाने lein ring uberjar। लीन uberjar के लिए 'अंगूठी' अतिरिक्त ध्यान दें। यह माना जाता है कि आप लीन-रिंग प्लगइन का उपयोग कर रहे हैं।

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

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