java - चींटी से मैवेन तक जटिल परियोजना को माइग्रेट करना-असामान्य फ़ोल्डर संरचनाओं को कैसे संभालना है?




maven ant build (3)

मैंने अतीत में एक समान प्रवासन किया है, और मेरे पास आपके समान संदेह थे; हालांकि, मैं "फ़ोल्डर संरचना को बरकरार रखने और पीओएम फाइलों में पथ निर्दिष्ट करने" के लिए गया था और मैंने देखा कि यह उतना बुरा नहीं था जितना मैंने सोचा था।

मुझे वास्तव में क्या करना था <sourceDirectory> और <sourceDirectory> को उचित रूप से सेट करना था और शायद कुछ समावेशन और बहिष्करण फ़िल्टर जोड़ना था, लेकिन अंत में मैं कहूंगा कि यहां तक ​​कि अगर मैवेन का तरीका वास्तव में सम्मेलन-ओवर-कॉन्फ़िगरेशन-आश है और यदि आप फ़ाइलों को कहां रखना है, इसके निर्देशों का पालन करते हैं तो यह आपके जीवन को आसान बनाता है, यदि आप ऐसा नहीं करते हैं तो यह वास्तव में कठिन नहीं होता है।

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

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

मेरी नई परियोजना में मुझे कई मॉड्यूल के साथ एक जटिल आधारभूत संरचना का सामना करना पड़ रहा है जो वर्षों से एक अप्रिय, अनियंत्रित तरीके से उगाया गया है।

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

मेरी योजना पूरी परियोजना को चींटी से मेवेन में माइग्रेट करना था या नहीं, क्योंकि नए घटकों की योजना बनाई गई है और मैं भविष्य में और अच्छी तरह से इन समस्याओं से बचना चाहता हूं, क्योंकि यह अब बहुत ही भयानक है ;-)

चूंकि मैं बड़ी परियोजनाओं के प्रवासन के लिए नया हूं, इसलिए मैं सबसे अच्छे वर्कफ़्लो के बारे में थोड़ा उलझन में हूं। दर्जनों एक्सएमएल फाइलें और स्क्रिप्ट शामिल हैं, जिन्हें गैर-मैवेन निर्देशिका संरचना में वितरित किया जाता है। कुल मिलाकर 3000 से ज्यादा फाइलें शामिल हैं। मुख्य समस्याओं में से एक यह है कि मुझे नहीं पता कि मुझे वास्तव में ज्ञात मेवेन निर्देशिका संरचना में सबकुछ माइग्रेट करने का प्रयास करना चाहिए और इसलिए प्रत्येक फ़ाइल की अंतहीन संपादन और पुन: सक्रिय करने का जोखिम उठाना चाहिए। या क्या मुझे फ़ोल्डर संरचना को रखना चाहिए और मेरी pom.xml फ़ाइलों को फूटाना चाहिए और संभवतः सभी अलग-अलग प्लगइन के साथ समस्याओं में भाग लेना चाहिए? ईमानदारी से, दोनों तरीकों से काफी रचनात्मक नहीं लगता है।

क्या यह इस आयाम में एक परियोजना को माइवेन में माइग्रेट करने का भी अर्थ है? विशेष रूप से जब एसओए ढांचे को अपनी चींटी फाइलों का उपयोग करना चाहिए - इसलिए चींटी और मेवेन का संयोजन आवश्यक होगा। इस प्रक्रिया को सरल बनाने के लिए सबसे अच्छी रणनीति क्या होगी?

सभी सुझावों के लिए धन्यवाद।


एंट प्रोजेक्ट मेवेनिंग करने का एक सरल और त्वरित उत्तर यहां दिया गया है:

ऐसा मत करो!

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

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

मुझे पता है क्योंकि मैंने बिल्कुल यह किया था। सिस्टम आर्किटेक्चर के प्रमुख ने फैसला किया कि मैवेन नया और अच्छा है जबकि चींटी खराब और बुराई होनी चाहिए। इससे कोई फर्क नहीं पड़ता कि निर्माण काम करता है और अच्छी तरह से संरचित थे। नहीं, चींटी जाना चाहिए, और मेवेन रास्ता है।

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

यह नरक का आंतरिक सर्कल था।

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

सौभाग्य से, Ivy नामक चींटी के लिए पहले से ही मौजूदा निर्भरता प्रबंधन प्रणाली है। आइवी के बारे में अच्छी बात यह है कि यह वर्तमान मेवेन आर्किटेक्चर के साथ काम करता है। आप अपनी साइट के केंद्रीकृत मेवेन रिपोजिटरी का उपयोग कर सकते हैं, और आइवी उस भंडार में जार को मैवेन कलाकृतियों के रूप में तैनात कर सकता है।

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

वर्तमान निर्माण प्रणाली में परियोजना को जोड़ना बहुत मुश्किल नहीं था:

  • वर्तमान परियोजना में हमारी ivy.dir परियोजना को एकीकृत करने के लिए ivy.dir build.xml में कुछ पंक्तियों में जोड़ना पड़ा।
  • मुझे उस परियोजना के लिए एक ivy.xml फ़ाइल को परिभाषित करना ivy.xml
  • मैंने <jar और </jar> से <jar.macro और </jar.macro> किसी भी उदाहरण को बदल दिया। इस मैक्रो ने मानक <jar/> कार्य किया सबकुछ किया, लेकिन यह जार में pom.xml को भी एम्बेड करता है जैसे मैवेन बनाता है। (आइवी के पास ivy.xml फ़ाइल को pom.xml में परिवर्तित करने का कार्य है)।
  • मैंने सभी पुराने निर्भरता प्रबंधन बकवास को हटा दिया जो अन्य डेवलपर ने जोड़ा। यह एक सौ लाइनों द्वारा build.xml फ़ाइल को कम कर सकता है। मैंने चेकआउट और काम करता है, या ftp'd या scp'd सामान पर सभी सामान बाहर फेंक दिया। यह सब सामान उनके जेनकींस बिल्ड सिस्टम के लिए था, लेकिन जेनकींस बिल्ड फाइलों से किसी भी मदद के बिना इसे संभाल सकता है, धन्यवाद।
  • आइवी एकीकृत करने के लिए कुछ लाइनें जोड़ें। सबसे आसान तरीका lib निर्देशिका में जार को हटाना था, और फिर उन्हें ivy.xml माध्यम से डाउनलोड करें। सभी एक साथ, ऐसा करने के लिए build.xml में कोड जोड़ने के लिए दर्जन लाइनों को जोड़ा या बदला जा सकता है।

मैं उस बिंदु पर पहुंचा जहां मैं आइवी को कुछ घंटों में एक परियोजना में एकीकृत कर सकता था - अगर निर्माण प्रक्रिया स्वयं भी गड़बड़ नहीं हुई थी। अगर मुझे scratch से build.xml को फिर से लिखना पड़ा, तो मुझे दो या तीन दिन लग सकते हैं।

आइवी का उपयोग करके हमारी चींटी निर्माण प्रक्रिया को साफ कर दिया गया और हमें पूर्ण पुनर्गठन के बिना मेवेन में हमारे कई फायदे मिलेंगे।

वैसे, इस प्रक्रिया के लिए सबसे उपयोगी उपकरण तुलना से परे है । इसने मुझे जल्दी से सत्यापित करने की अनुमति दी कि नई बिल्ड प्रक्रिया पुराने के साथ संगत थी।

वैसे भी मेवेन पर चल रहा है ...

मजाकिया बात यह है कि एक बार जब आपने अपनी चींटी परियोजनाओं को आइवी के साथ एकीकृत किया है, तो उन्हें मेवेन परियोजनाओं में बदलना मुश्किल नहीं है:

  • अपने build.xml में तर्क को साफ करें। आपको इसे स्क्रैच से फिर से लिखना पड़ सकता है, लेकिन अधिकांश निर्भरता प्रबंधन कचरे के बिना, यह इतना मुश्किल नहीं है।
  • एक बार build.xml साफ़ हो जाने के बाद, मैवेन की संरचना से मेल खाने तक निर्देशिका को आगे बढ़ना शुरू करें।
  • नई निर्देशिका संरचना से मेल खाने के लिए स्रोत बदलें। आपके पास एक WAR हो सकता है जिसमें * गैर-मानक स्थान में * सीएसएस फ़ाइलें शामिल हों, और कोड उस निर्देशिका में इन फ़ाइलों की अपेक्षा करने के लिए कड़ी मेहनत की गई है। नई निर्देशिका संरचना से मेल खाने के लिए आपको अपना जावा कोड बदलना पड़ सकता है।
  • चींटी परियोजनाओं को तोड़ें जो विभिन्न परियोजनाओं को अलग-अलग चींटी परियोजनाओं में बनाते हैं जो प्रत्येक एक आर्टिफैक्ट बनाता है।
  • एक pom.xml जोड़ें और build.xml हटा दें।

1 हाँ, मुझे पता है कि यह पूरी तरह से सच नहीं है। उप-परियोजनाओं और सुपर पोम्स के साथ मेवेन परियोजनाएं हैं। लेकिन, आपके पास कभी भी एक मेवेन प्रोजेक्ट नहीं होगा जो चार अलग-अलग असंबद्ध जार बनाता है जबकि यह चींटी में काफी आम है।


संसाधनों के साथ प्रयास करें ताकि वे सभी को ब्रांड्स में घोषित करके कई संसाधनों के साथ उपयोग किया जा सके। documentation देखें

लिंक किए गए दस्तावेज से प्रासंगिक कोड अंश:

public static void writeToFileZipFileContents(String zipFileName,
                                           String outputFileName)
                                           throws java.io.IOException {

    java.nio.charset.Charset charset =
         java.nio.charset.StandardCharsets.US_ASCII;
    java.nio.file.Path outputFilePath =
         java.nio.file.Paths.get(outputFileName);

    // Open zip file and create output file with 
    // try-with-resources statement

    try (
        java.util.zip.ZipFile zf =
             new java.util.zip.ZipFile(zipFileName);
        java.io.BufferedWriter writer = 
            java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
    ) {
        // Enumerate each entry
        for (java.util.Enumeration entries =
                                zf.entries();     entries.hasMoreElements();) {
            // Get the entry name and write it to the output file
            String newLine = System.getProperty("line.separator");
            String zipEntryName =
                 ((java.util.zip.ZipEntry)entries.nextElement()).getName() 
             newLine;
            writer.write(zipEntryName, 0, zipEntryName.length());
        }
    }
}

यदि आपकी ऑब्जेक्ट्स DataInputStream ( DataInputStream करता है) को लागू नहीं करती हैं, या संसाधनों के साथ प्रयास करने से पहले घोषित किया जाना चाहिए, तो उन्हें बंद करने के लिए उचित स्थान finally ब्लॉक में है, जो लिंक किए गए दस्तावेज़ों में भी उल्लेख किया गया है।







java maven ant build