javac विकल्प किसी दिए गए निर्देशिका के तहत सभी जावा फ़ाइलों को पुनरावर्ती रूप से संकलित करने का विकल्प


127

मैं अपने प्रोजेक्ट में जावा फ़ाइलों को संकलित करने के लिए javac संकलक का उपयोग कर रहा हूं। फ़ाइलें इस तरह कई संकुल पर वितरित कर रहे हैं: com.vistas.util, com.vistas.converter, com.vistas.LineHelper, com.current.mdcontect

इनमें से प्रत्येक पैकेज में कई जावा फाइलें हैं। मैं इस तरह javac का उपयोग कर रहा हूं:

javac com/vistas/util/*.java com/vistas/converter/*.java
      com.vistas.LineHelper/*.java com/current/mdcontect/*.java

(एक पंक्ति में)

इतने सारे रास्ते देने के बजाय, मैं कंपाइलर को मूल कॉम निर्देशिका से सभी जावा फ़ाइलों को पुन: संकलन करने के लिए कैसे कह सकता हूं?


2
आपको वास्तव में चींटी या मावेन जैसे उपकरणों पर एक नज़र रखना चाहिए।
लॉरेंट पीरिन

यह SO पोस्ट उपयोगी stackoverflow.com/questions/864630/…
गोपी

जवाबों:


220

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

जावाक का उपयोग करना

यदि आपको किसी बड़ी परियोजना के लिए कुछ करने की आवश्यकता है और पास में कोई उचित निर्माण उपकरण नहीं है, तो आप हमेशा एक छोटी सी चाल का उपयोग कर सकते हैं जो javacप्रदान करता है: संकलन करने के लिए क्लासनाम को एक फ़ाइल में निर्दिष्ट किया जा सकता है। आपको बस उपसर्ग के javacसाथ फाइल का नाम देना होगा @

यदि आप *.javaअपने प्रोजेक्ट की सभी फाइलों की सूची बना सकते हैं , तो यह आसान है:

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
  • फायदा यह है कि यह एक त्वरित और आसान उपाय है।
  • दोष यह है कि आपको sources.txtहर बार एक नया स्रोत बनाने के लिए फाइल को फिर से तैयार करना पड़ता है या किसी मौजूदा एक फ़ाइल का नाम बदलना पड़ता है, जिसे भूलना आसान है (इस प्रकार त्रुटि-प्रवण) और थकाऊ कार्य।

बिल्ड टूल का उपयोग करना

लंबे समय तक एक उपकरण का उपयोग करना बेहतर होता है जिसे सॉफ्टवेयर बनाने के लिए डिज़ाइन किया गया था।

चींटी का उपयोग करना

यदि आप एक सरल build.xmlफ़ाइल बनाते हैं, जो बताती है कि सॉफ्टवेयर कैसे बनाया जाए:

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>

आप निम्नलिखित कमांड को चलाकर पूरे सॉफ्टवेयर को संकलित कर सकते हैं:

$ ant
  • लाभ यह है कि आप एक मानक बिल्ड टूल का उपयोग कर रहे हैं जो विस्तार करना आसान है।
  • दोष यह है कि आपको एक अतिरिक्त टूल डाउनलोड करना, सेट अप करना और सीखना है। ध्यान दें कि अधिकांश IDE (जैसे NetBeans और Eclipse) बिल्ड फ़ाइलों को लिखने के लिए बहुत सहायता प्रदान करते हैं ताकि आपको इस मामले में कुछ भी डाउनलोड न करना पड़े।

मावेन का उपयोग करना

मावेन उस तुच्छ के साथ स्थापित करने और काम करने के लिए नहीं है, लेकिन इसे सीखना अच्छी तरह से भुगतान करता है। यहां 5 मिनट के भीतर एक परियोजना शुरू करने के लिए एक महान ट्यूटोरियल है ।

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

एक आईडीई का उपयोग करना

अब जब आपकी विकास उत्पादकता बढ़ सकती है। कुछ खुले स्रोत विकल्प हैं (जैसे कि ग्रहण और नेटबीन्स , मैं पूर्व को पसंद करता हूं) और यहां तक ​​कि वाणिज्यिक (जैसे इंटेलीजे ) जो काफी लोकप्रिय और शक्तिशाली हैं।

वे पृष्ठभूमि में प्रोजेक्ट बिल्डिंग का प्रबंधन कर सकते हैं ताकि आपको सभी कमांड लाइन के सामान से निपटना न पड़े। हालाँकि, यह हमेशा काम आता है यदि आप जानते हैं कि वास्तव में पृष्ठभूमि में क्या होता है तो आप कभी-कभार होने वाली त्रुटियों जैसे शिकार कर सकते हैं ClassNotFoundException

एक अतिरिक्त नोट

बड़ी परियोजनाओं के लिए, हमेशा एक आईडीई और एक बिल्ड टूल का उपयोग करने की सलाह दी जाती है । पूर्व आपकी उत्पादकता को बढ़ाता है, जबकि उत्तरार्द्ध परियोजना के साथ अलग-अलग आईडीई का उपयोग करना संभव बनाता है (उदाहरण के लिए, मावेन एक साधारण mvn eclipse:eclipseकमांड के साथ एक्लिप्स प्रोजेक्ट डिस्क्रिप्टर उत्पन्न कर सकता है )। इसके अलावा, एक ऐसी परियोजना का होना, जिसका परीक्षण / निर्माण एक ही लाइन कमांड के साथ किया जा सकता है, नए सहयोगियों से परिचय करना आसान है और उदाहरण के लिए एक निरंतर एकीकरण सर्वर में। केक का टुकड़ा :-)


4
उपयोग करते समय javac, आउटपुट निर्देशिका निर्दिष्ट करना बेहतर होगा। find -name "*.java" > sources.txt && javac -d bin @sources.txt। अन्यथा * .class फ़ाइलों को उस निर्देशिका में सहेजा जाता है जहां स्रोत हैं।
दिमित्री

1
बिल्कुल सच। हालांकि मेरी राय में, अगर किसी ने बस के साथ खेलना शुरू कर दिया है javac, की अवधारणा CLASSPATH, कोड को कैसे चलाना javaहै, पैकेज से कैसे निपटना है, जिसे चलाने के लिए रूट फ़ोल्डर होना चाहिए, आदि आमतौर पर स्पष्ट नहीं होते हैं। इस प्रकार मैंने आउटपुट डायर को छोड़ दिया। वैसे भी, सुझाव के लिए धन्यवाद!
रेलीगेंडी १४'१४ को leg:

6
इस पर आने वाले मैक उपयोगकर्ताओं के लिए, findकमांड है: find . -name "*.java" > sources.txt(ध्यान दें .)
MrDuk

@MrDuk क्या जोड़ रहा है "।" करना? क्या यह वर्तमान निर्देशिका के भीतर खोज करने के लिए है?
ब्रैडी शेहान

@BradySheehan इसे दिए गए रास्ते से खोजना शुरू कर देंगे। "।" वर्तमान शब्दकोश से शुरू होता है। नोट आपको लगता है कि है खोजने के लिए एक रास्ता (ओएस एक्स में) निर्दिष्ट करने के लिए
क्रिस

40
find . -name "*.java" -print | xargs javac 

किंदा क्रूर, लेकिन नरक की तरह काम करता है। (केवल छोटे कार्यक्रमों पर प्रयोग करें, यह बिल्कुल कुशल नहीं है)


1
यदि आप इस विचार का उपयोग करते हैं find ... -print0और xargs -0 ...इसके बजाय फ़ाइल नाम में रिक्त स्थान पर नहीं तोड़ते हैं
sapht

29

यदि आपका शेल इसका समर्थन करता है, तो क्या यह काम पसंद करेगा?

javac com/**/*.java 

यदि आपका खोल समर्थन नहीं करता है **, तो हो सकता है

javac com/*/*/*.java

काम करता है (3 घटकों के साथ सभी पैकेजों के लिए - कम या ज्यादा के लिए अनुकूलित करें)।


मैंने विंडोज़ 10 पर कमांड प्रॉम्प्ट में इसका उपयोग करने का प्रयास किया है। क्या कोई यह पुष्टि कर सकता है कि क्या यह विंडोज़ 10 पर काम करता है या यदि मैं इसे गलत कर रहा हूँ
Dan

26

सामान्य स्थिति में जहां आप अपनी पूरी परियोजना को संकलित करना चाहते हैं, आप बस अपने मुख्य वर्ग के साथ जेवैक की आपूर्ति कर सकते हैं और सभी आवश्यक निर्भरताओं को संकलित कर सकते हैं:

javac -sourcepath . path/to/Main.java


बहुत सरल विधि, अतिरिक्त फ़ाइलों पर भरोसा नहीं करती है
अलंकृत करें

यह उन लोगों के लिए सबसे अच्छा और सरल है, जिनके पास चींटी (मेरे जैसे) सीखने के लिए ज्यादा समय नहीं है
हमजा अब्बद

यह दुर्भाग्यपूर्ण है। यदि आप स्पर्श नहीं करते हैं Main.java, जिसे आप शायद अपनी दूसरी फ़ाइल बनाने के बाद नहीं करेंगे, तो कुछ और संकलक नहीं होगा।
टॉम हॉकिन -

यहाँ भी अच्छी तरह से काम नहीं करता है। कुछ निर्भरताएँ परिवर्तित होने के बावजूद पुन: स्थापित नहीं की जाती हैं। @ TomHawtin-tackline मैंने पहले मुख्य पर स्पर्श की कोशिश की लेकिन कुछ भी नहीं। शायद सभी पर स्पर्श आवश्यक है। हालांकि अजीब तरह का।
एमएम

5

javac -cp "jar_path/*" $(find . -name '*.java')

(मैं पसंद करता हूं कि xargs का उपयोग न करें क्योंकि यह उन्हें कई बार विभाजित कर सकता है और javac को चला सकता है, प्रत्येक में java फ़ाइलों का सबसेट होता है, जिनमें से कुछ उसी javac कमांड लाइन पर निर्दिष्ट नहीं किए गए अन्य आयात कर सकते हैं)

यदि आपके पास एक App.java एंट्रीपॉइंट है, तो फ्रीक का रास्ता -स्रोतपथ सबसे अच्छा है। यह आयात-निर्भरता का पालन करते हुए हर दूसरी जावा फ़ाइल को संकलित करता है। उदाहरण के लिए:

javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java

आप एक लक्ष्य वर्ग-फ़ाइल dir भी निर्दिष्ट कर सकते हैं -d target/:।


3

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

आपको बिल्ड.xml फ़ाइल में इस तरह एक लक्ष्य को परिभाषित करना होगा:

<target name="compile">
    <javac srcdir="your/source/directory"
           destdir="your/output/directory"
           classpath="xyz.jar" />
</target>

2

मैं केवल एक साधारण मेकफाइल के साथ मेक का उपयोग कर रहा हूं जो इस तरह दिखता है:

JAVAC = javac -Xlint:unchecked
sources = $(shell find . -type f -name '*.java')
classes = $(sources:.java=.class)

all : $(classes)

clean :
        rm -f $(classes)

%.class : %.java
        $(JAVAC) $<

यह एक समय में स्रोतों को संकलित करता है और यदि आवश्यक हो तो केवल recompiles।


1

javac कमांड एक पुनरावर्ती संकलन प्रक्रिया का पालन नहीं करता है, इसलिए आपने कमांड चलाते समय प्रत्येक निर्देशिका को निर्दिष्ट किया है, या उन निर्देशिकाओं के साथ एक पाठ फ़ाइल प्रदान करें जिन्हें आप शामिल करना चाहते हैं:

javac -classpath "${CLASSPATH}" @java_sources.txt

0

मैं इसे एक Xcode JNI परियोजना में पुनरावर्ती रूप से अपने परीक्षण वर्गों के निर्माण के लिए उपयोग कर रहा हूं:

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.