जावा: मैं कोड की पूरी निर्देशिका संरचना कैसे संकलित कर सकता हूं?


84

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

मैं javac का उपयोग करके टर्मिनल से इस पूरी चीज़ को कैसे संकलित करूं?


जिज्ञासा से बाहर, आप किस ओएस का उपयोग कर रहे हैं - विंडोज, लिनक्स, मैक, आदि। यह प्रश्न का उत्तर देने में मदद कर सकता है
Zach L

1
मैंने एक दो साल में कमांड लाइन पर जावा को संकलित नहीं किया है, लेकिन मुझे लगता है कि अगर आप सिर्फ अपने मुख्य () से javac वाली फाइल को पास करते हैं, तो यह अन्य सभी फाइलों को खोज लेगा, जिन्हें आपके सभी निर्भरता के रूप में संकलित करने की आवश्यकता है मुख्य () युक्त फ़ाइल से शुरू की खोज की।
एंडोफेगे

जवाबों:


59

आपको सभी निर्देशिकाओं को जानना होगा, या वाइल्डकार्ड का उपयोग करने में सक्षम होना चाहिए।

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java

2
मुझे यह लगा: बस या तो अपने नाम या वाइल्डकार्ड का उपयोग करके javac के बाद सभी .java फ़ाइलों को सूचीबद्ध करें।
व्यंजना १३

52
या सिर्फ उपयोग करें javac $(find . -name "*.java")
जॉर्ज शॉर्ली


40

यदि आप सब करना चाहते हैं तो अपनी मुख्य कक्षा चलाएं (उन .javaफ़ाइलों को संकलित किए बिना, जिन पर मुख्य वर्ग निर्भर नहीं करता है), तो आप निम्न कार्य कर सकते हैं:

cd <root-package-directory>
javac <complete-path-to-main-class>

या

javac -cp <root-package-directory> <complete-path-to-main-class>

javac स्वचालित रूप से सभी निर्भरताओं को हल करेगा और सभी निर्भरताओं को भी संकलित करेगा।


4
यह अब तक का सबसे आसान काम है। लोग इसे पसंद क्यों नहीं करते?
अल्फा

11
शायद इसलिए कि इसकी सादगी इस तथ्य को नजरअंदाज करती है कि लाइब्रेरी या सपोर्ट कोड के लिए कई संकलन नौकरियों में सभी मुख्य आश्रितों को जोड़ने का एक मुख्य तरीका नहीं होगा। यह एक अच्छा जवाब है, लेकिन मैं किसी भी ढांचे / सार्वजनिक कोडबेस में कभी भी उपयोग नहीं करूंगा।
अजाक्स

4
IMHO, फ्रेमवर्क या किसी भी अन्य सार्वजनिक परियोजनाओं को किसी प्रकार के बिल्ड प्रबंधन का उपयोग करना चाहिए। इस तरह के संकलन, केवल छोटे निजी परियोजनाओं पर समझ में आते हैं।
svenwltr

@ अजाक्स लेकिन अगर ऐसा है, तो आप -sourcepath .विकल्प का उपयोग भी कर सकते हैं और फिर उसी प्रभाव के लिए मुख्य फाइल को नाम दे सकते हैं
कोडरकेट

1
कौन कहता है कि एक मुख्य है? कौन कहता है कि चार साधन नहीं हैं? क्या प्रत्येक वर्ग जिसे आप अपने आउटपुट में चाहते हैं, यहां तक ​​कि मुख्य द्वारा संदर्भित (और मेटा-इन / सेवाओं या अन्य सेवा लोडिंग तकनीक का उपयोग नहीं कर रहा है)। यदि आप सभी कर रहे हैं एक मुख्य परीक्षण, यह विधि ठीक है, हालांकि, यह "दिए गए निर्देशिका में सभी जावा फ़ाइलों को संकलित करने" के पूर्ण कार्य को संबोधित करने में विफल रहता है। एक उचित बिल्ड सिस्टम # 1 है, जैसे cli उपकरण find . -type f -name "*.java" | xargs javac नंबर 2 हैं, और यह विधि केवल अगर एक एकल मुख्य विधि प्रविष्टि बिंदु है जो पूरे ऐप को शामिल करती है।
अजाक्स

12

मैं जॉन का सुझाव लेता हूं और चींटी का उपयोग करता हूं , क्योंकि यह एक बहुत ही जटिल काम है।

हालाँकि, यदि आप टर्मिनल में एक पंक्ति में यह सब प्राप्त करने के लिए दृढ़ हैं, तो लिनक्स पर आप खोज कमांड का उपयोग कर सकते हैं । लेकिन मैं यह बिल्कुल नहीं सुझाता, क्योंकि कोई गारंटी नहीं है कि, कहते हैं, Foo.java को Bar.java के बाद भी संकलित किया जाएगा, भले ही वह Fooउपयोग करता हो Bar। एक उदाहरण होगा:

find . -type f -name "*.java" -exec javac {} \;

यदि आपकी सभी कक्षाओं को अभी तक संकलित नहीं किया गया है, अगर एक मुख्य दोहन या ड्राइवर वर्ग है (मूल रूप से एक जिसमें आपका मुख्य तरीका है), यह संकलन करते हुए कि मुख्य वर्ग को व्यक्तिगत रूप से अधिकांश परियोजना को संकलित करना चाहिए, भले ही वे विभिन्न फ़ोल्डरों में हों, क्योंकि निर्भरता के मुद्दों को हल करने के लिए Javac अपनी क्षमताओं का सर्वश्रेष्ठ प्रयास करेगा।


1
विंडोज़ पर कोई भी find_gnu . -type f -name "*.java" | xargs javacएक बार उपयोग कर सकता है जब find.exe का gnu संस्करण find_gnu.exe पर बदल जाता है। मुझे मेरा gnu मिल गया।
n611x007

या शुद्ध विंडोज बैच पर: for /f "usebackq" %f in (``dir /s /b *.java``) do javac %f(सिंगल बैक-कोट्स का उपयोग करें dir /s /bलेकिन मुझे इसे ठीक से फॉर्मेट करने का तरीका नहीं मिल रहा है)।
मैथ्यू

मुझे लगता है कि findसमाधान समस्याग्रस्त है क्योंकि यह प्रत्येक जावा वर्ग को अलग-अलग संकलित करता है, जिससे यह बहुत धीमा हो जाता है।
एलिकएल्ज़िन-किलाका

12

निम्नलिखित विधि मुझे मिली है:

1) एक फ़ाइल में रिश्तेदार पथों के साथ फ़ाइलों की एक सूची बनाएं (FilesList.txt के रूप में) निम्नानुसार है (या तो स्थान अलग हो गया या अलग हो गया:

foo/AccessTestInterface.java
foo/goo/AccessTestInterfaceImpl.java

2) कमांड का उपयोग करें:

javac @FilesList.txt -d classes

यह सभी फ़ाइलों को संकलित करेगा और वर्ग फ़ाइलों को कक्षाओं निर्देशिका के अंदर रखेगा।

FilesList.txt बनाने का अब आसान तरीका यह है: अपने स्रोत रूट निर्देशिका पर जाएं।

dir *.java /s /b > FilesList.txt

लेकिन, यह निरपेक्ष मार्ग को आबाद करेगा। एक टेक्स्ट एडिटर का उपयोग करके "सभी को बदलें" स्रोत निर्देशिका तक (अंत में \ _ शामिल करें) "" (यानी खाली स्ट्रिंग) और सहेजें।


यह अधिक "देशी" तरीका है, क्योंकि
जेवैक

"dir * .java / s / b> FilesList.txt" एक पथ रिक्त स्थान होने पर दृष्टिकोण काम नहीं करेगा। javac FilesList.txt के बारे में शिकायत करेगा
aderesh

10

पहले से मौजूद उत्तर केवल * .java फ़ाइलों के साथ ही चिंता करने के लिए प्रतीत होते हैं और आसानी से कैसे पुस्तकालय फ़ाइलों के साथ ऐसा करने के लिए नहीं है कि निर्माण के लिए आवश्यक हो सकता है।

एक अच्छी एक-लाइन स्थिति जो पुनरावर्ती सभी * .java फ़ाइलों के साथ-साथ भवन के लिए आवश्यक * .jar फ़ाइलों को भी शामिल करती है:

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)

यहाँ बिन फाइल क्लास फाइल्स का डेस्टिनेशन है, लिब (और संभावित रूप से करंट वर्किंग डाइरेक्टरी) में लाइब्रेरी फाइल्स हैं और src डायरेक्टरी और बॉटम में सभी जावा फाइल्स संकलित हैं।


मुझे स्वैगर द्वारा उत्पन्न क्लाइंट सोर्स कोड को संकलित करने में समस्या हो रही है
Eenvincible

9

इस तरह से ऐसा करने के लिए आपको चींटी जैसी किसी चीज़ का उपयोग करना होगा:

http://ant.apache.org/manual/Tasks/javac.html

आपको निम्नलिखित के साथ संकलित नामक लक्ष्य के साथ एक बिल्ड स्क्रिप्ट बनाने की आवश्यकता होगी:

<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.java"/>
</javac>

तब आप सभी फ़ाइलों को चलाकर संकलित कर पाएंगे:

 ant compile

वैकल्पिक रूप से, अपनी परियोजना को ग्रहण में आयात करें और यह स्वचालित रूप से उस परियोजना के लिए सभी स्रोत फ़ाइलों को संकलित करेगा।


दुर्भाग्य से, यह एक सर्वर पर किया जाना चाहिए जो चींटी का समर्थन नहीं करता है।
युफोरिया 21३

2

पाइप चरित्र का उपयोग किए बिना ऐसा करने का एक तरीका है, जो सुविधाजनक है यदि आप ऐसा करने के लिए किसी अन्य प्रोग्रामिंग भाषा से एक प्रक्रिया के लिए मजबूर कर रहे हैं:

find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +

यद्यपि यदि आप बैश में हैं और / या पाइप का उपयोग करने में कोई आपत्ति नहीं है, तो आप यह कर सकते हैं:

find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR

2

विंडोज समाधान: उप-निर्देशिका 'src' में निहित सभी फाइलों को मानते हुए, और आप उन्हें 'बिन' के लिए संकलित करना चाहते हैं।

for /r src %i in (*.java) do javac %i -sourcepath src -d bin

यदि src में .java फ़ाइल इसके तुरंत नीचे है तो यह तेज है

javac src\\*.java -d bin

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