जावा के लिए मेक इन का उपयोग क्यों नहीं किया जा रहा है?


162

बस हर जावा प्रोजेक्ट के बारे में जो मैंने देखा है या तो मावेन या एंट का उपयोग करता है वे ठीक उपकरण हैं और मुझे लगता है कि किसी भी परियोजना के बारे में उनका उपयोग कर सकते हैं। लेकिन क्या कभी बना ? यह विभिन्न गैर-जावा परियोजनाओं के लिए उपयोग किया जाता है और आसानी से जावा को संभाल सकता है। यदि आप Windows का उपयोग करते हैं तो आपको Make.exe डाउनलोड करना होगा, लेकिन Ant और Maven भी JDK के साथ नहीं आते हैं।

क्या जावा के साथ उपयोग किए जाने के दौरान कुछ मूलभूत दोष हैं? क्या यह सिर्फ इसलिए कि चींटी और मावेन जावा में लिखे गए हैं?


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

एक तरफ, ग्रैडल जावा स्पेस में एक नया खिलाड़ी है, जैसा कि गैंट (कुछ हद तक) है। मावेन या चींटी एक गलत द्विभाजन है।
माइकल ईस्टर

@ मीकल ईस्टर, झूठे द्वैतवाद मावेन / एंट बनाम मेक होगा। सही डायकोटॉमी, अगर मैं आपको सही पढ़ रहा हूं, तो ग्रेडल / मैवेन / गेंट / एंट बनाम मेक होगा। लेकिन यह कहना कठिन है :)
दान रोसेनस्टार्क

जवाबों:


192

मेक और जावा के साथ मूल मुद्दा यह है कि मेक पर उस काम को करें जिसे आपने एक निर्भरता निर्दिष्ट किया है, और फिर उस निर्भरता को हल करने के लिए एक नियम।

बुनियादी सी के साथ, वह आमतौर पर "एक main.c फ़ाइल को main.o फ़ाइल में बदलने के लिए," cc main.c "चलाता है।

आप इसे जावा में कर सकते हैं, लेकिन आप जल्दी से कुछ सीखते हैं।

ज्यादातर यह है कि javac संकलक शुरू करने के लिए धीमा है।

के बीच भिन्नता:

javac Main.java
javac This.java
javac That.java
javac Other.java

तथा

javac Main.java This.java That.java Other.java

रात और दिन है।

निष्पादित करें कि सैकड़ों वर्गों के साथ, और यह सिर्फ अस्थिर हो जाता है।

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

यह भी निर्धारित करने में बहुत अच्छा नहीं है कि संग्रह स्तर पर कौन सी फाइलें पुरानी हैं।

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

इसीलिए चींटी और मावेन जैसे विकल्प सामने आए।


6
तो एक विशाल जावा परियोजना में मेक का उपयोग करने के लिए, सभी परिवर्तित .java फ़ाइलों की एक सूची को बनाए रखना आवश्यक होगा और फिर आखिर में javac कहेंगे? यह मेरे लिए आदर्श से कम लगता है। यह सबसे अच्छा जवाब है जो मैंने अब तक देखा है।
उपयोगकर्ता 1

32
मुझे यह पसंद है। आवश्यक आप कह रहे हैं चींटी को इस तथ्य को संबोधित करने की आवश्यकता थी कि जेवैक बहुत धीमा है।
cmcginty

25
यदि आप इसका उपयोग करने के लिए डिज़ाइन किया गया था, तो Javac धीमा नहीं है। यदि आप एक बार में एक फ़ाइल संकलित करने के लिए इसका उपयोग करते हैं तो यह धीमा है।
स्टीफन सी

7
@ कैसी जेवैक भी धीमा नहीं है। जेवीएम शुरू करने के लिए बहुत धीमा है।
थोरबजोरन राव एंडरसन

7
GNU मेक कम से कम $?ऑटोमैटिक वैरिएबल है जो "सभी पूर्वापेक्षाएँ जो लक्ष्य से नए हैं" तक फैलती है। कई लक्ष्यों के साथ पैटर्न नियमों की भी विशेषता है जो सभी .classफाइलों को अपडेट करने के लिए केवल एक बार नुस्खा चलाएंगे । कम्बाइन कि फ़ाइल से कुछ चतुर उपयोग के साथ / पाठ कार्यों की तरह $(wildcard), $(shell), $(eval)और आप बिल्ड लक्ष्य अपनी निर्देशिका लेआउट में फैले खोजने के लिए अपने makefile सिखा सकते हैं।
2287 पर तंज87

33

आदरणीय makeकार्यक्रम सी और सी ++ जैसी अलग-अलग संकलित भाषाओं को यथोचित रूप से संभालता है। आप एक मॉड्यूल संकलित करते हैं, यह #includeदूसरे के पाठ में शामिल फ़ाइलों को खींचने के लिए उपयोग करता है, और आउटपुट के रूप में एकल ऑब्जेक्ट फ़ाइल लिखता है। कंपाइलर एक-एक-एक-समय प्रणाली है, ऑब्जेक्ट फ़ाइलों को निष्पादन योग्य बाइनरी में बाँधने के लिए एक अलग लिंकिंग चरण के साथ।

हालाँकि, जावा में, कंपाइलर को वास्तव में अन्य वर्गों को संकलित करना होता है जिन्हें आप आयात करते हैं import। यद्यपि यह कुछ ऐसा लिखना संभव होगा जो जावा स्रोत कोड से सभी आवश्यक निर्भरताएं उत्पन्न करता है, ताकि makeएक समय में सही क्रम में कक्षाएं बन सकें, यह अभी भी परिपत्र निर्भरता जैसे मामलों को संभाल नहीं पाएगा।

जावा कंपाइलर अन्य कक्षाओं के संकलित परिणामों को कैशिंग करके भी अधिक कुशल हो सकता है, जबकि आगे की कक्षाओं को संकलित करना जो पहले से संकलित किए गए परिणामों पर निर्भर करते हैं। इस तरह की स्वचालित निर्भरता का मूल्यांकन वास्तव में makeअकेले संभव नहीं है ।


7
ऐसा लगता है कि मेक बनाम जेवैक के मुकाबले मेक बनाम एंट / मावेन के उत्तर की तुलना में अधिक है। आपके जवाब के आधार पर, कोई व्यक्ति सिर्फ एक बार मेक + जेवाक (पूरे पैकेज या "मॉड्यूल" को जेवैक का उपयोग क्यों नहीं कर सकता है, इसलिए परिपत्र निर्भरताएं मेक से छिपी हैं)? क्या चींटी या मावेन उस दृष्टिकोण पर कोई लाभ प्रदान करेंगे?
लॉरेंस गोन्साल्व्स

1
@ गौर: आप एक बार में पूरे पैकेज को javac दे सकते हैं, लेकिन फिर यह उस पैकेज में सब कुछ फिर से शुरू कर देगा (क्योंकि आपने इसे ऐसा करने के लिए कहा था)। यह सच है कि जावा कंपाइलर बहुत तेज है, लेकिन यह और भी तेज है अगर आप यह निर्धारित करते हैं कि कुछ बदलने के बाद कौन से वर्ग को पुन: प्रयास करने की न्यूनतम आवश्यकता है।
ग्रेग हेवगिल

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

4
इसके अलावा, यह अभी भी स्पष्ट नहीं करता है कि मैं सीधे सीधे javac के बजाय चींटी या मावेन का उपयोग क्यों करूंगा ...
लारेंस गोंसाल्विस

28

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


10
हम इसका उपयोग करते हैं, और आग एक हजार और एक सूरज की तुलना में गर्म है।
reccles

4
@ क्रेक: क्या यह केवल इंजीनियरिंग बनाने या खुद बनाने के प्रति घृणा है? एंट, मावेन, या कुछ और कैसे बेहतर होगा (यानी अपनी कक्षा के लिए एक बुरा उपकरण है)?
उपयोगकर्ता 1

5
@ उपयोगकर्ता 1 makeमें बहुत सारी "विशेषताएं" हैं जो कि लिखे जाने पर समझ में आ सकती हैं, लेकिन अब कीड़े की तरह अधिक हैं, उदाहरण के लिए, आपको कुछ स्थानों पर रिक्त स्थान नहीं, एक TAB वर्ण का उपयोग करना चाहिए। इस तरह की बात शायद उन लोगों को परेशान नहीं करती है जो वास्तव में अनुभवी हैं make, लेकिन यह हम में से बाकी को पागल कर देता है।
हांक गे

4
@ हंसग्यु: अपने संपादक को उस विवरण के बारे में चिंता करने दें। यदि आपका संपादक टैब <-> स्थान सेटिंग्स को सही ढंग से नहीं संभाल सकता है, तो एक नया संपादक प्राप्त करें और आप बहुत खुश होंगे। लेकिन आप यह कहने में सही हैं कि कई विशेषताएं पुरानी हैं जिस तरह से गतिशील निर्भरताएं ( make dependकिसी को भी?) को नियंत्रित किया जाता है
D.Shawley

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

28

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

JAVA_FILES:=$(wildcard *.java)
#
# the rest is independent of the directory
#
JAVA_CLASSES:=$(patsubst %.java,%.class,$(JAVA_FILES))

.PHONY: classes
LIST:=

classes: $(JAVA_CLASSES)
        if [ ! -z "$(LIST)" ] ; then \
                javac $(LIST) ; \
        fi

$(JAVA_CLASSES) : %.class : %.java
        $(eval LIST+=$$<)

4
अच्छा! मैं तो जैसे कुछ ढूंढ रहा था। जब सार्वभौमिक क्लासिक ठीक काम करता है तो हर भाषा के लिए एक अलग बिल्ड टूल का उपयोग करने की आवश्यकता नहीं होती है। धन्यवाद!
आरपी

17

प्रत्येक के तकनीकी गुणों के बारे में अन्य सभी उत्तर सही हैं। Antऔर Mavenमेक गे की तुलना में जावा के लिए बेहतर अनुकूल हो सकता है, या जैसा कि हांक गे बताते हैं, वे नहीं हो सकते :)

हालाँकि, आपने पूछा कि क्या यह मायने रखता है कि चींटी और मावेन जावा में लिखे गए हैं। हालांकि StackOverflow पर हम इस तरह के विचारों (बंद नहीं! प्रोग्रामिंग-संबंधित-आदि!) पर विचार नहीं करते हैं, जो कि इस विषय का हिस्सा है। रेल पर हम रेक का उपयोग करते हैं, सी दोस्तों का उपयोग करते हैं, और जावा में हम चींटी और मावेन का उपयोग करते हैं। हालांकि यह सच है कि चींटी या मावेन डेवलपर्स जावा डेवलपर के बाद शायद दूसरों की तुलना में बेहतर होंगे, एक और सवाल यह भी है: आप एंट कार्यों में क्या लिखते हैं? जावा। यदि आप एक जावा डेवलपर हैं, तो यह एक आसान फिट है।

तो, हाँ, इसका एक हिस्सा उस भाषा में लिखे गए टूल का उपयोग करना है जिसे आप टूलींग कर रहे हैं।


7
चींटी भी ऐसे समय में पैदा हुई जब जावा समुदाय को एक्सएमएल के साथ हटा दिया गया था। (जो यह कहना नहीं है कि एक्सएमएल में जगह नहीं है।)
लॉरेंस गोन्साल्व्स

3
@Laurence गोंजाल्विस, वह यह है कि इतना सच। लेकिन कृपया, हम SO पर यहाँ fads के बारे में बात नहीं करते हैं :) मैं उस समय जावा देव सिखा रहा था, और हर कोई XML था। अब यह एक्सएमएल है, लेकिन कोई परवाह नहीं करता है।
दान रोसेनस्टार्क

1
टूलींग टिप्पणी एक दिलचस्प है। makeUNIX बैकग्राउंड से आता है इसलिए टूलिंग को उपयोगी कॉम्पैक्ट यूटिलिटीज लिखकर और उन्हें एक साथ पाइपेलिंग करके किया जाता है। यही कारण है कि शेल कमांड्स का उपयोग करके अधिकांश सिलाई की जाती है।
D.Shawley

2
@D। शॉली, सभी सच्चे संबंध makeऔर छोटे यूनिक्स बर्तन । GIT उस प्रक्रिया का एक बच्चा भी है। एक व्यक्तिगत टिप्पणी पर, मैं नहीं कहूंगा कि यह बेहतर नहीं है। लेकिन यह जावा प्रोग्रामर्स के लिए एक बहुत बड़ा बदलाव है। चींटी जावा-के-सोच के साथ बहुत अधिक मेल खाती है।
दान रोसेनस्टार्क

12

चींटी और बाद में मावेन की वजह से कुछ सिरदर्द को हल करने के लिए डिज़ाइन किया गया था Make(प्रक्रिया में नए लोगों को बनाते समय) यह सिर्फ विकास है।

... इसके तुरंत बाद, कई ओपन सोर्स जावा प्रोजेक्ट्स ने महसूस किया कि चींटी उन समस्याओं को हल कर सकती है जो मेकफाइल्स के साथ थीं ...।

से http://ant.apache.org/faq.html#history

चाहे वे कुछ भी हल करें या सीखने के लिए केवल एक अतिरिक्त प्रारूप बनाएं एक व्यक्तिपरक विषय है। सच्चाई यह है कि हर नए आविष्कार का इतिहास बहुत सुंदर है: निर्माता कहते हैं कि यह बहुत सारी समस्याओं को हल करता है और मूल उपयोगकर्ताओं का कहना है कि वे गुण हैं।

इसका मुख्य लाभ, जावा के साथ एकीकृत करने की संभावना है।

मुझे लगता है कि rakeउदाहरण के लिए एक समान इतिहास होगा ।


4
यह बहुत विशिष्ट नहीं है। मावेन के कारण सिर दर्द क्या हल करता है?
लॉरेंस गोंसाल्वेस

1
@Gonsalves: खैर, यह हर नई तकनीक के व्यक्तिपरक पहलुओं में से एक है, विकल्प के निर्माता का कहना है कि यह बहुत सारी समस्याओं को हल करता है और प्रतिस्थापित प्रौद्योगिकी के रचनाकारों का कहना है कि वे दोष नहीं हैं, लेकिन गुण और इतने पर। मुझे लगता है कि इस विशेष स्थिति में बॉक्स के बाहर जावा एकीकरण और क्रॉस संकलन था
OscarRyz

2
[आपके उत्तर के सम्पादन का संदर्भ देते हुए, आपकी सबसे हालिया टिप्पणी नहीं] जो अभी भी यह नहीं समझाता है कि क्या समस्याएँ हल हुईं, केवल यह कि रचनाकारों का दावा है कि समस्याएँ हल हो गईं ...: - / मेरी धारणा है कि चींटी मूल रूप से बनाई गई थी मेक के लिए एक सरल विकल्प हो। समय के साथ, लोगों ने पाया कि ऐसी चीजें थीं जो गायब थीं और इसलिए उन्होंने फीचर को तब तक जोड़ा जब तक चींटी केवल जटिल नहीं बन गई, लेकिन बिनुटिल्स बिल्ट-इन (बाह्य उपकरणों जैसे कि सीपी, आरएम, आदि पर बहुत निर्भर करता है), और बेशक XML सिंटैक्स है।
लॉरेंस गोंसाल्वेस

2
हां, लेकिन जब एक नए विकल्प का सबसे अच्छा निर्माता कर सकता है, तो यह कहें कि "यह समस्या पुराने को हल करती है" वास्तव में यह कहे बिना कि वे समस्याएं क्या हैं जो उन लोगों के लिए इतनी उपयोगी नहीं हैं, जिन पर विचार करना है कि किस विकल्प का उपयोग करें। क्या चींटी मेरे साथ होने वाली समस्याओं को हल करती है, या क्या यह मेरे लिए नई समस्याओं को पेश करते समय उन समस्याओं को हल करती है जिन्हें मैं समस्या नहीं मानता हूं?
लारेंस गोंसाल्वेस

9

मेवेन (और आइवी-इनेबल्ड ऐन्ट सेटअप) मेक द्वारा हल किए गए प्रमुख मुद्दों में से एक स्वचालित निर्भरता रिज़ॉल्यूशन और आपके निर्भरता जार का डाउनलोडिंग है।


6

मुझे लगता है कि सबसे अधिक संभावना यह है कि कई कारकों ने जावा समुदाय के भीतर महत्वपूर्ण समय में (1990 के अंत में) मेक के उपयोग को हतोत्साहित किया:

  1. क्योंकि जावा कई प्लेटफार्मों को शामिल करता है, इसलिए सामान्य रूप से जावा प्रोग्रामर यूनिक्स टूल पर विशेष रूप से निपुण नहीं थे क्योंकि प्रोग्रामर आमतौर पर यूनिक्स वातावरण (जैसे, सी और पर्ल प्रोग्रामर) तक ही सीमित थे। ध्यान दें कि यह सामान्य है। एक शक के बिना और यूनिक्स की गहरी समझ के साथ जावा प्रोग्रामर को उपहार में दिए गए थे।
  2. नतीजतन वे बनाने में कम माहिर थे और प्रभावी ढंग से उपयोग करने का तरीका नहीं जानते थे।
  3. हालांकि एक छोटा और सरल मेकफाइल लिखना संभव है जो जावा को कुशलतापूर्वक संकलित करता है, एक प्लेटफॉर्म-स्वतंत्र तरीके से ऐसा करने के लिए अतिरिक्त देखभाल की आवश्यकता होती है।
  4. नतीजतन एक आंतरिक रूप से प्लेटफ़ॉर्म-स्वतंत्र बिल्ड टूल के लिए एक भूख थी।
  5. यह इस माहौल में था कि चींटी और बाद में मावेन बनाया गया था।

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


5

स्क्रिप्ट बनाने के लिए स्वाभाविक रूप से प्लेटफ़ॉर्म पर निर्भर होना चाहिए। जावा को स्वतंत्र प्लेटफ़ॉर्म माना जाता है। इसलिए एक बिल्ड सिस्टम का होना जो मल्टी-प्लेटफॉर्म सोर्सबेस के लिए केवल एक प्लेटफॉर्म पर काम करता है, एक समस्या है।


5

संक्षिप्त उत्तर: क्योंकि makeअच्छा नहीं है। यहां तक ​​कि सी के मोर्चे पर आपको कई विकल्प दिखाई देते हैं।

लंबे उत्तर: makeकई दोष हैं जो इसे सी संकलन के लिए मुश्किल से उपयुक्त बनाते हैं, और जावा को संकलित करने के लिए अनुपयुक्त हैं। आप इसे जावा को संकलित करने के लिए बाध्य कर सकते हैं, यदि आप चाहते हैं, लेकिन मुद्दों में चलने की उम्मीद करते हैं, जिनमें से कुछ के पास उपयुक्त समाधान या समाधान नहीं है। यहाँ कुछ है:

निर्भरता का संकल्प

makeस्वाभाविक रूप से फ़ाइलों की अपेक्षा है कि वे एक-दूसरे पर एक पेड़ की तरह निर्भरता रखते हैं, जिसमें एक फ़ाइल कई अन्य लोगों के निर्माण का उत्पादन है। हेडर फ़ाइलों से निपटने के दौरान यह पहले से ही सी में बैकफ़ायर करता है। इसकी हेडर फ़ाइलों पर C फ़ाइल की निर्भरता का प्रतिनिधित्व करने के लिए makeएक आवश्यक makeफ़ाइल को शामिल करने के लिए फ़ाइल को शामिल करने की आवश्यकता होती है , इसलिए बाद में एक परिवर्तन से पहले पुनर्निर्माण का कारण होगा। हालाँकि, चूंकि सी फ़ाइल स्वयं (केवल पुनर्निर्माण) फिर से नहीं बनाई गई है, इसलिए अक्सर लक्ष्य को निर्दिष्ट करने की आवश्यकता होती है.PHONY । सौभाग्य से, GCC उन फ़ाइलों को स्वचालित रूप से बनाने का समर्थन करता है।

जावा में, निर्भरता परिपत्र हो सकती है, और makeप्रारूप में ऑटो-जनरेटिंग क्लास निर्भरता के लिए कोई उपकरण नहीं है । antके Dependकार्य कर सकते हैं, बजाय, वर्ग फ़ाइल को पढ़ने सीधे, जो निर्धारित कक्षाओं यह आयात, और वर्ग फ़ाइल को नष्ट करता है, तो उनमें से किसी को पुराने हो चुके हैं। इसके बिना, किसी भी गैर-तुच्छ निर्भरता के परिणामस्वरूप आपको बार-बार साफ बिल्ड का उपयोग करने के लिए मजबूर किया जा सकता है, बिल्ड टूल का उपयोग करने के किसी भी लाभ को हटा दिया जाता है।

फ़ाइल नाम में रिक्त स्थान

हालांकि, न तो जावा और न ही सी आपके स्रोत कोड फ़ाइलनामों में रिक्त स्थान का उपयोग करने के लिए प्रोत्साहित करते हैं, इसमें makeसमस्या तब भी हो सकती है जब रिक्त स्थान फ़ाइल पथ में हों। उदाहरण के लिए, यदि आपका स्रोत कोड मौजूद है, तो विचार करें C:\My Documents\My Code\program\src। यह तोड़ने के लिए पर्याप्त होगा make। ऐसा इसलिए है क्योंकि makeफाइलनामों को तार के रूप में माना जाता है। antपथ को विशेष वस्तु मानते हैं।

बिल्ड के लिए स्कैनिंग फ़ाइलें

makeप्रत्येक लक्ष्य के लिए कौन सी फाइलें बनानी हैं, यह स्पष्ट रूप से निर्धारित करने की आवश्यकता है। antएक फ़ोल्डर को निर्दिष्ट करने की अनुमति देता है जो स्रोत फ़ाइलों के लिए ऑटो-स्कैन किया जाना है। यह एक छोटी सी सुविधा की तरह लग सकता है, लेकिन विचार करें कि जावा में प्रत्येक नए वर्ग को एक नई फ़ाइल की आवश्यकता होती है। प्रोजेक्ट में फ़ाइलें जोड़ना एक बड़ी परेशानी बन सकता है।

और सबसे बड़ी समस्या make:

बनाना POSIX- निर्भर है

जावा का आदर्श वाक्य "हर जगह एक बार चलने वाला संकलन" है। लेकिन उस संकलन को POSIX- आधारित सिस्टमों तक सीमित करना, जिसमें जावा समर्थन वास्तव में सबसे खराब है, इरादा नहीं है।

नियमों का निर्माण makeअनिवार्य रूप से छोटी bashलिपियों में है। हालांकि एक बंदरगाह हैmake विंडोज है, लेकिन इसे ठीक से काम करने के लिए, इसे एक पोर्ट के साथ बंडल करना होगा bash, जिसमें फाइल सिस्टम के लिए एक POSIX इम्यूलेशन परत शामिल है।

यह दो किस्मों में आता है:

  1. MSYS जो POSIX अनुवाद को फ़ाइल पथों तक सीमित करने की कोशिश करता है, और इसलिए विशेष रूप से इसके लिए नहीं बनाए गए बाहरी उपकरणों को चलाने पर अप्रिय गोच हो सकता है।

  2. cygwinजो एक पूर्ण POSIX अनुकरण प्रदान करता है। हालाँकि, परिणामी कार्यक्रम अभी भी उस अनुकरण परत पर निर्भर हैं।

इस कारण से, विंडोज पर, मानक बिल्ड टूल बिल्कुल भी नहीं है make, बल्कि MSBuild, जो कि XML- आधारित टूल भी है, सिद्धांत के करीब हैant

इसके विपरीत, antजावा में बनाया गया है, हर जगह चल सकता है, और इसमें आंतरिक उपकरण शामिल हैं, जिन्हें "कार्य" कहा जाता है, फाइलों में हेरफेर करने और एक प्लेटफॉर्म-स्वतंत्र तरीके से कमांड निष्पादित करने के लिए। यह पर्याप्त रूप से बहुमुखी है कि आप वास्तव में उपयोग करने की antतुलना में विंडोज में सी प्रोग्राम बनाने का एक आसान समय बना सकते हैं make

और एक आखिरी नाबालिग:

यहां तक ​​कि सी कार्यक्रमों का उपयोग मूल रूप से नहीं करते हैं

आप शुरू में इसे नोटिस नहीं कर सकते हैं, लेकिन सी प्रोग्राम आमतौर पर ए के साथ शिप नहीं किए जाते हैं Makefile। उन्हें एक CMakeLists.txt, या एक bashकॉन्फ़िगरेशन स्क्रिप्ट के साथ भेज दिया जाता है , जो वास्तविक उत्पन्न करता है Makefile। इसके विपरीत, एक जावा प्रोग्राम के स्रोत का उपयोग करके बनाया antके साथ एक भेज दिया जाता है antस्क्रिप्ट पहले से बने। A Makefileअन्य उपकरणों का एक उत्पाद है - यह है कि makeअपने आप एक बिल्ड टूल बनने के लिए कितना अनुपयुक्त है।antस्टैंडअलोन है, और किसी भी अतिरिक्त आवश्यकताओं या निर्भरता के बिना आपकी जावा बिल्ड प्रक्रिया के लिए आपको जो कुछ भी चाहिए, उससे संबंधित है।

जब आप antकिसी भी प्लेटफ़ॉर्म पर चलते हैं , तो जस्ट वर्क्स (tm)। आप ऐसा नहीं कर सकते make। यह अविश्वसनीय रूप से मंच और विन्यास पर निर्भर है।


4

जब तक मैं कोई नहीं हूँ कोई भी धारणा नहीं है (गलत) मेक फॉर जावा का उपयोग करना गलत है।

"GNU मेक के साथ प्रबंध परियोजनाओं" (GFDL के तहत उपलब्ध) में makeजावा परियोजनाओं के साथ उपयोग करने के लिए समर्पित एक पूरा अध्याय शामिल है ।

जैसा कि इसमें अन्य साधनों के बजाय उपयोग करने के पेशेवरों और विपक्षों की एक लंबी (और उम्मीद है कि निष्पक्ष) सूची है जो आप वहां देखना चाहते हैं। (देखें: http://oreilly.com/catalog/make3/book/ )


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

3

चींटी मेकफाइल्स पर एक XML कॉन्फ़िगरेशन उन्मुख सुधार है और मावेन चींटी पर निर्भरता निर्माण उपकरण सुधार है। कुछ परियोजनाएं तीनों का उपयोग करती हैं। मुझे लगता है कि JDK प्रोजेक्ट्स मेकफाइल्स और चींटी के मिश्रण का उपयोग करते थे।


1

एक बड़ा कारण यह है कि चींटी और मावेन (और सबसे जावा लक्षित SCM, CI और IDE उपकरण) दोनों जावा में जावा डेवलपर्स के लिए / द्वारा लिखे गए हैं। यह आपके विकास के वातावरण में एकीकृत करने के लिए सरल बनाता है और अन्य उपकरणों जैसे आईडीई और सीआई सर्वरों को बिल्ड / परिनियोजन बुनियादी ढांचे के भीतर चींटी / मावेन पुस्तकालयों के कुछ हिस्सों को एकीकृत करने की अनुमति देता है।


1

एक बार मैंने एक जावा प्रोजेक्ट पर काम किया जिसमें gmake का इस्तेमाल किया गया था। मेरी याद ताजा है, लेकिन IIRC के पास पैकेज डायरेक्टरी स्ट्रक्चर के साथ एक कठिन समय था जो जेवैक की अपेक्षा रखता है। मुझे यह भी याद है कि JAR फ़ाइलों का निर्माण एक परेशानी थी जब तक कि आपके पास कुछ तुच्छ नहीं था।


1

ApacheAnt मेक की तरह कुछ भी नहीं है। बनाओ फ़ाइलों के बीच निर्भरता का वर्णन करने के लिए है, और फ़ाइलों का निर्माण कैसे करें। चींटी "कार्यों" के बीच निर्भरता के बारे में है, और वास्तव में ग्लूइंग बिल्ड स्क्रिप्ट के एक तरीके से अधिक है।

यह आपको AntVsMake में मदद कर सकता है


मैं वास्तव में चढ़ाव के कारणों के बारे में जानना चाहूंगा।
हैगेलो

0

चींटी और मावेन निर्माण निर्भरता ग्राफ और इसके प्रबंधन से अधिक 'आधुनिक' दृष्टिकोण से संपर्क करते हैं ... लेकिन जैसा कि ऑस्कर कहते हैं, उन्होंने पुरानी समस्याओं को बनाने की कोशिश करते हुए अपनी समस्याओं का निर्माण किया।


0

मैंने Java प्रोजेक्ट्स के लिए कभी GNU मेक का इस्तेमाल नहीं किया है, लेकिन मैंने jmk का इस्तेमाल किया है । अफसोस की बात यह है कि इसे 2002 से अपडेट नहीं किया गया है।

इसकी कुछ जावा-विशिष्ट कार्यक्षमता थी, लेकिन अपने स्रोत टारबॉल में शामिल करने के लिए काफी छोटा था ताकि इसके आकार में काफी वृद्धि हो सके।

आजकल मुझे लगता है कि चींटी स्थापित के साथ मैं किसी भी जावा डेवलपर को साझा करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.