2010-05-13 13 views
5

मैं एक काफी सरल वेब अनुप्रयोग को विकसित करने और रिलीज़ करने का सबसे अच्छा तरीका जानने की कोशिश कर रहा हूं, और मैं कई समस्याओं में भाग रहा हूं। मैं अपने द्वारा किए गए निर्णयों की रूपरेखा तैयार करूंगा, क्योंकि कहीं मैं रेलों से स्पष्ट रूप से चला गया हूं .. किसी भी मदद के लिए बहुत आभारी हूं!जावा वेब एप्लिकेशन सर्वोत्तम प्रथाओं

मेरे पास जो लगता है वह एक साधारण सरल वेब एप्लिकेशन है। इसमें कुछ जेएसपीएस शामिल हैं जो कुछ जावा बीन्स, और सामान्य स्थैतिक एचटीएमएल, जेएस, सीएसएस और छवियों का संदर्भ देते हैं।

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

निर्णय 2) मैं अपनी स्थानीय मशीन पर चीज़ों को उत्पादन वातावरण के लिए जितना संभव हो उतना होना चाहता था। तो मेरे एचटीएमएल में, उदाहरण के लिए, मेरे पास http://static.foo.com/file जैसी स्थिर फ़ाइल का संदर्भ हो सकता है। इस कोड को देव और प्रोड पर निर्बाध रूप से काम करने के लिए, मैंने स्थानीय/स्थानीय रूप से विकसित होने पर static.foo.com को अपने/etc/hosts में डालने का निर्णय लिया, ताकि सभी यूआरएल कुछ भी बदले बिना सही तरीके से काम कर सकें।

निर्णय 3) मैंने ग्रहण और मेवेन का उपयोग करने का फैसला किया ताकि मुझे मेरी परियोजना का प्रशासन और निर्माण करने के लिए एक सर्वोत्तम अभ्यास वातावरण प्रदान किया जा सके।

तो मैं सिवाय इसके कि एक अच्छा तंग अब की स्थापना की है,:

हर बार जब मैं विकास में कुछ भी बदलने की, एक HTML फ़ाइल में एक पंक्ति की तरह चाहते हैं, मैं पूरी परियोजना के पुनर्निर्माण और उसके बाद के लिए इंतजार करना पड़ता है मैं देख सकता हूं कि क्या मैं चाहता हूं कि युद्ध को लोड करने के लिए टोमकैट। तो मेरे प्रश्न हैं:

1) क्या ग्रहण और टोमकैट को जोड़ने का कोई तरीका है ताकि मुझे हर बार युद्ध का पुनर्निर्माण करने की आवश्यकता न हो? यानी टॉमकैट स्थिर फाइलों को पूरा करने के लिए सीधे मेरे वास्तविक वर्कस्पेस पर देख रहा है?

2) मुझे लगता है कि मैं उत्पादन यूआरएल को प्रतिबिंबित करने के लिए/etc/hosts का उपयोग कर चीजों को कठिन बना रहा हूं - क्या एक बेहतर तरीका है जिसमें यूआरएल पर मैन्युअल रूप से परिवर्तन शामिल नहीं है (सापेक्ष यूआरएल बिल्कुल ठीक है, लेकिन जहां आपके पास कई सबडोमेन हैं, स्थिर फ़ाइलों के लिए एक और गतिशील के लिए एक कहें, आपको निश्चित पथ लिखना होगा, निश्चित रूप से?)

3) क्या यह वास्तव में सबसे अच्छा अभ्यास है ?? लोग चीजों को कैसे सेट करते हैं ताकि वे एक हाथ पर एक स्वचालित, सर्वव्यापी निर्माण प्रक्रिया के लिए आवश्यकता को संतुलित कर सकें, और गति और लचीलापन जावास्क्रिप्ट और एचटीएमएल और सीएसएस को जल्दी से विकसित करने में सक्षम हो, जैसे ही कोई एक बस इंगित करता है निर्देशिका में apache और विकसित विकसित? लोगों को क्या काम मिलते हैं?

बहुत धन्यवाद!

संपादित करें: आपके सभी महान प्रतिक्रियाओं के लिए धन्यवाद! अगर मैं उन्हें ठीक से चिह्नित कर सकता हूं, तो मैं .. यह वास्तव में मेरी मदद करता है। जो मैं सुन रहा हूं वह यह है कि विकास में वेबपैप की संरचना को संरक्षित करना और इसे यथासंभव उत्पादन के करीब एक पर्यावरण के रूप में चलाने के लिए सबसे अच्छा अभ्यास है। ऐसा लगता है कि लोगों के बीच मतभेद इस बात की सीमा है कि लोग सर्वलेट कंटेनर में संसाधनों को तैनात करने के लिए तैयार हैं, थोड़ी अतिरिक्त गति या सुविधा के लिए निर्माण प्रक्रिया को बाधित करते हैं। यह समझ आता है। एक बार फिर धन्यवाद।

उत्तर

3

# 1 उत्तर देने के लिए, मैं निम्नलिखित सुझाव है:

  1. ग्रहण के बिना अपने .war निर्माण करने के लिए Maven सीखने कुछ समय बिताएं। उचित आर्केटाइप के साथ यह मुश्किल नहीं है।यहाँ अधिक जानकारी के लिए देखें: http://maven.apache.org/guides/mini/guide-webapp.html
  2. Maven ग्रहण परियोजनाओं उत्पन्न कर सकते हैं या तो mvn eclipse:eclipse के माध्यम से या अपने स्थानीय मशीन और उत्पादन के लिए तैनाती के लिए एम 2 प्लगइन
  3. का उपयोग करके, Maven कार्गो प्लगइन का उपयोग। http://cargo.codehaus.org/Maven2+plugin और http://blank.jasonwhaley.com/2010/03/automated-deployment-with-cargo-drive.html

प्रश्न # 2 उत्तर देने के लिए, आपकी/etc/hosts फ़ाइल को संशोधित करने के उत्पादन की नकल करने में कोई बुराई नहीं है। बस एक त्वरित स्क्रिप्ट है जो आपको उन प्रविष्टियों को जोड़ने/निकालने देती है और आपके डीएनएस कैश को फ्लश करती है। मैं बिल्कुल यही करता हूं। (अपने ब्राउज़र को अपनी प्रासंगिक सेटिंग के माध्यम से अक्सर अपने कैश को साफ़ करना सुनिश्चित करें)।

प्रश्न 3 #) हाँ यह है जवाब देने के लिए कैसे आप काम करने दिया जाना चाहिए। प्रत्येक निर्माण के परिणामस्वरूप एक ही तैनाती योग्य आर्टिफैक्ट होना चाहिए जिसे आप अपने किसी भी वातावरण में एक चरण में तैनात कर सकते हैं। आपको यह सुनिश्चित करने की ज़रूरत है कि आप इसे अपने आईडीई के बिना कर सकते हैं और विकास चरण के दौरान आपकी सहायता के लिए केवल एक उपकरण के रूप में आईडीई का उपयोग कर सकते हैं।

+0

धन्यवाद व्हेली।तो मैं स्पष्ट हूं - क्या आप यह पुष्टि कर रहे हैं कि अगर मैं चाहता हूं कि, जावास्क्रिप्ट की एक पंक्ति में त्वरित चेतावनी डालें, या किसी HTML फ़ाइल में कुछ पाठ में टाइपो को सही करें, तो मुझे युद्ध की प्रतीक्षा करनी होगी पुनर्निर्माण और फिर मेरे विकास सर्वलेट कंटेनर में तैनात (यहां तक ​​कि स्वचालित रूप से), और केवल तभी मैं अपने परिवर्तन का परिणाम देख सकता हूं? यदि ऐसा है, तो प्रोजेक्ट फ़ाइलों पर कुछ सही दिशा देने की दक्षता की तुलना में यह बहुत ठंडा लगता है। क्या मैं सही ढंग से समझ गया हूं, या क्या मुझे कुछ याद आ रहा है? – Jeremy

+0

यह वही है जो मैं सुझाव दे रहा हूं। यदि आपके उत्पादन परिनियोजन में .war बूंद शामिल हैं, तो यही है कि आपकी विकास परिनियोजन भी दिखना चाहिए। जावा वेबपैप्स को युद्ध के रूप में बंडल और तैनात किया जाना है - मुझे लगता है कि जब आप उस सम्मेलन के आसपास काम करने की कोशिश नहीं करते हैं तो जीवन हमेशा आसान होता है। – whaley

+0

ग्रहण के वेबटोल/ईई संस्करण का उपयोग करके आप अपनी परियोजना को स्थानीय टॉमकैट (या अन्य कंटेनर) स्थापना के साथ "लिंक" कर सकते हैं, ताकि आप युद्ध पीढ़ी/तैनाती के इंतजार किए बिना छोटे बदलावों का पूर्वावलोकन कर सकें। – agnul

4

वहाँ ग्रहण और बिल्ला ताकि मैं की जरूरत नहीं है युद्ध हर बार कनेक्ट करने के लिए पुनर्निर्माण के लिए एक रास्ता है?

1) मुझे लगता है कि आप अपने आईडीई पर बहुत अधिक भरोसा कर रहे हैं। आम तौर पर मेरे पास एक चींटी build.xml है जिसमें कुछ कार्य हैं: एक "युद्ध का निर्माण" है, दूसरा "अद्यतन jsps" है। युद्ध का निर्माण सभी कोड संकलित करता है, इसे पैकेज करता है, इसे टॉमकैट पर तैनात करता है और सबकुछ पुनः प्रारंभ करता है। जेएसपीएस अपडेट करना सर्वर को पुनरारंभ नहीं करता है, यह सिर्फ मेरी स्थानीय फाइलों से टोमकैट के तैनात उदाहरण में एक सीधी प्रति है। जेएसपी हैं क्योंकि कोई भी पुनरारंभ नहीं है। लगभग आधे सेकेंड लेता है।

जहां कई उप डोमेन में है, का कहना है कि के लिए स्थिर फाइलों के लिए एक और एक गतिशील, आप पूरा पथ को लिखने के लिए, निश्चित रूप से है?

2) कोई रास्ता नहीं, जोस। तो आपका मतलब है कि जब भी सर्वर का नाम बदलता है, तो आपको अपना कोड दोबारा बनाना होगा? यदि आपको गतिशील यूआरएल का समर्थन करने की ज़रूरत है तो आप बुलेट को काटना चाहते हैं और आपके लिए भारी उठाने के लिए एक ढांचे को देखना चाहते हैं। मैं आंशिक हूं Stripes (जो डायनामिक यूआरएल री-राइटिंग आउट ऑफ़ द बॉक्स का समर्थन करता है) ... अन्य भी हैं।

+0

क्षमा करें, मैं सबडोमेन यूआरएल बिंदु के बारे में बहुत स्पष्ट नहीं था। मेरा मतलब यह है कि अगर आपके पास केवल अपने कोड में सापेक्ष यूआरएल हैं जैसे href = file.html, तो वे देव और प्रोड पर समान रूप से काम करते हैं। लेकिन अगर आपके पास www.foo.com पर स्थित फ़ाइल f.html है, जिसका HTML STATIC.foo.com पर स्थित फ़ाइल f2.html का संदर्भ देता है, उदाहरण के लिए href = http: //STATIC.foo.com/f2.html, तो आप उन यूआरएल को अभी भी अपने/etc/hosts फ़ाइल में प्रविष्टियों को डालकर देव और प्रोड में ठीक काम कर सकते हैं: 127.0.0.1 www.foo.com STATIC.foo.com अब देव में, उन यूआरएल सभी को हल करते हैं आपकी स्थानीय मशीन, जो आप चाहते हैं, कोड बदलने के बिना। – Jeremy

+0

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

4

इतना मैं काम पर क्या करना है की तरह है, हालांकि हम चींटी का उपयोग करें (अब के लिए?)। साथ ही, जब मैं एक आईडीई (या दो) का उपयोग करता हूं, तो मैं से इनकार करता हूं ताकि मेरी बिल्ड प्रक्रिया के हिस्से के रूप में कोई भी हो। किसी को आपके निर्माण को समझने और ट्यून करने में सक्षम होना चाहिए।

+0

अस्वीकरण: मैं खिलौना/फेंकने वाली परियोजना के लिए "नो आईडीई बिल्ड" तोड़ दूंगा। लेकिन उत्पादन कार्य वातावरण में जारी कुछ के लिए नहीं। – Roboprog

2

दूसरों को पहले से ही आप, जवाब दे दिया है मैं सिर्फ इस पर टिप्पणी करेंगे (यह भी एक टिप्पणी के लिए लंबे समय तक btw तो मैं यह एक जवाब बनाने):

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

यदि आप एक HTML फ़ाइल में एक पंक्ति बदलते हैं, तो पूरी परियोजना को पुनर्निर्माण करने की कोई आवश्यकता नहीं है।

ध्यान दें कि मैं हमेशा पूर्ण .war पुनर्निर्माण और पुनर्वितरित मेरी .war लेकिन इस .war [कि वास्तव में क्या एक .war है है rezip को कम से कम दो सेकंड (एक सेकंड से कम समय लगता है, ज़िपित फ़ाइल] और एक सेकंड से कम यह पुनर्वितरित करने के लिए) है क्योंकि:

  • आप अपने पूरे परियोजना पुन: संयोजित करने के लिए जब आप बस एक html फ़ाइल

ही जब में एक लाइन को बदलने की जरूरत नहीं है आप एक .java फ़ाइल को बदलते हैं: आप बस उस फ़ाइल और पुन: युद्ध को पुनः संकलित कर सकते हैं।

मैंने अपनी खुद की चींटी बिल्ड फ़ाइल स्क्रैच से (यहां कोई मेवेन नहीं) लिखा है और मुझे कई लक्ष्य मिल गए हैं। मैं एक "साफ निर्माण" को मजबूर कर सकता हूं, जो कि सबकुछ फिर से संकलित करेगा लेकिन आम तौर पर मैं केवल पुन: पैकेजिंग और पुनर्वितरण कर रहा हूं .war

आप इसे अपने लिए जांच सकते हैं: एक .war बनाएं, इसे अनजिप करें, कहें, निर्देशिका dir1, फिर एक .html (या एक .java/.class फ़ाइल) को संशोधित करें और एक नया .war बनाएं और उस नए को अनजिप करें। कहें, dir2

तो तुलना dir1 और dir2: अब अपनी निर्माण प्रक्रिया को ठीक है, ताकि आप सब कुछ पुन: संयोजित करने के लिए जरूरत के बिना है कि दूसरी .war बना सकते हैं।

एक .html, .java, .jsp, .css, .js/जो भी फ़ाइल बदलना और एक नया पुनर्वितरण करना .war सेकंड का मामला होना चाहिए (यदि आप रसोई सिंक फेंक नहीं देते हैं तो दो सेकंड से कम होना चाहिए आपका वेबपैप)।

ध्यान दें कि एक ही प्रोजेक्ट पर, एक और डेवलपर यहां "हॉट तैनाती" पसंद करता है/सीधे विस्फोटित वेबपैप में फ़ाइलों को प्रतिस्थापित करता है (मैं हर बार एक .war को फिर से तैनात करना पसंद करता हूं और क्योंकि मेरा पूरा पुनर्वास/पुनर्वित्त दो से कम लेता है सेकंड मैं इस तरह से ठीक हूँ)।

+0

ओह, सटीक रूप से भूल गए: मुझे एक * वास्तव में * तेज़ लिनक्स वर्कस्टेशन मिला है जिसमें स्मृति के शेल! टोडल हैं, इसलिए मेरे सहकर्मी सिस्टम (जो ओएस एक्स मैकबुक प्रो, ठीक मशीनों पर हैं) पर चीजें तेजी से होती हैं , लेकिन कहीं भी मेरे सिस्टम के जितना तेज़ नहीं है) :) लेकिन फिर भी, सब कुछ कुछ सेकंड का मामला होना चाहिए। [बीटीडब्ल्यू जब मैं दौड़ रहा हूं तो मुझे एमबीपी भी मिला है: यह ऐप्पल पर एक सस्ता शॉट नहीं है] – SyntaxT3rr0r

2

यदि आपकी परियोजना ग्रहण में एक गतिशील वेब ऐप है और टॉमकैट सर्वर को ठीक से कॉन्फ़िगर किया गया है तो आपको युद्ध फ़ाइल का पुनर्निर्माण करने की आवश्यकता नहीं है। नीचे दिए गए निर्देशों का पालन करें:

1) कैसे ग्रहण के साथ बिल्ला सर्वर को कॉन्फ़िगर करने के लिए नीचे दिए गए की जाँच करें: http://greatwebguy.com/programming/eclipse/make-eclipse-and-tomcat-play-nice-together/

2) आपके आवेदन के लिए संबंधित पथ लेकिन पूर्ण नहीं रास्तों का प्रयोग करें।

3) यदि आप उपर्युक्त 2 चरणों का पालन करते हैं तो आपके पास विकास के लिए सबसे अच्छा वातावरण है।

1

विकास के दौरान, आपको ग्रहण और टोमकैट को कॉन्फ़िगर करना चाहिए ताकि कोई पुनर्निर्माण/रेडलोय की आवश्यकता न हो। परिणाम देखने के लिए बस एचटीएमएल/सीएसएस/जेएसपी आदि को संशोधित करें, सहेजें, और रीफ्रेश करें।

लेकिन उत्पादन साइट पर तैनाती से पहले, आपको एक साफ पूर्ण निर्माण करना चाहिए और इसे सावधानी से जांचना चाहिए।

डोमेन: वे एक कॉन्फ़िगरेशन फ़ाइल में होना चाहिए; देव और प्रोड में अलग-अलग कॉन्फ़िगरेशन फ़ाइलें होनी चाहिए।

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