Java Language
जावा कंपाइलर - 'जेवैक'
खोज…
टिप्पणियों
जावा स्रोत फ़ाइलों को बायटेकोड फ़ाइलों के संकलन के लिए javac
कमांड का उपयोग किया जाता है। बाइटकोड फ़ाइलें प्लेटफ़ॉर्म स्वतंत्र हैं। इसका मतलब है कि आप अपने कोड को एक प्रकार के हार्डवेयर और ऑपरेटिंग सिस्टम पर संकलित कर सकते हैं, और फिर जावा का समर्थन करने वाले किसी अन्य प्लेटफ़ॉर्म पर कोड चला सकते हैं।
जावा डेवलपमेंट किट (JDK) डिस्ट्रीब्यूशन में javac
कमांड शामिल है।
जावा कंपाइलर और बाकी मानक जावा टूलचैन कोड पर निम्नलिखित प्रतिबंध लगाते हैं:
- स्रोत कोड प्रत्यय ".java" के साथ फाइलों में रखा गया है
- बाइटकोड को प्रत्यय ".class" के साथ फाइलों में रखा जाता है।
- फ़ाइल सिस्टम में स्रोत और बाइटकोड फ़ाइलों के लिए, फ़ाइल पाथनाम को पैकेज और क्लास नामकरण को प्रतिबिंबित करना चाहिए।
नोट: javac
कंपाइलर जस्ट टाइम इन (जेआईटी) कंपाइलर के साथ भ्रमित नहीं होना चाहिए जो कि मूल कोड के लिए बायटेकोड्स को संकलित करता है।
'जावैक' कमांड - शुरू करना
सरल उदाहरण है
यह मानते हुए कि "HelloWorld.java" में निम्नलिखित जावा स्रोत शामिल हैं:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
(उपरोक्त कोड की व्याख्या के लिए, कृपया जावा भाषा से आरंभ करने का संदर्भ लें।)
हम इस कमांड का उपयोग करके उपरोक्त फाइल को संकलित कर सकते हैं:
$ javac HelloWorld.java
यह "HelloWorld.class" नामक एक फ़ाइल का उत्पादन करता है, जिसे हम निम्न प्रकार से चला सकते हैं:
$ java HelloWorld
Hello world!
इस उदाहरण से ध्यान देने योग्य मुख्य बिंदु हैं:
- स्रोत फ़ाइल नाम "HelloWorld.java" को स्रोत फ़ाइल में वर्ग नाम से मेल खाना चाहिए ... जो
HelloWorld
। यदि वे मेल नहीं खाते हैं, तो आपको एक संकलन त्रुटि मिलेगी। - बाइटकोड नाम "हैलोवर्ल्ड.क्लास" क्लासनेम से मेल खाता है। यदि आप "HelloWorld.class" का नाम बदलने के लिए थे, तो जब आप इसे चलाने की कोशिश करेंगे तो आपको एक त्रुटि मिलेगी।
- जावा का उपयोग करते हुए
java
एप्लिकेशन को चलाने पर, आप क्लासनेम नॉट बायटेकोड फाइलनाम की आपूर्ति करते हैं।
पैकेज के साथ उदाहरण
अधिकांश व्यावहारिक जावा कोड कक्षाओं के लिए नाम स्थान को व्यवस्थित करने और आकस्मिक वर्ग नाम टकराव के जोखिम को कम करने के लिए संकुल का उपयोग करता है।
अगर हम HelloWorld
क्लास को एक पैकेज कॉल com.example
में घोषित करना चाहते हैं, तो "HelloWorld.java" में निम्नलिखित जावा स्रोत शामिल होंगे:
package com.example;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
इस स्रोत कोड फ़ाइल को एक निर्देशिका ट्री में संग्रहीत करने की आवश्यकता होती है जिसकी संरचना पैकेज के नामकरण से मेल खाती है।
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
हम इस कमांड का उपयोग करके उपरोक्त फाइल को संकलित कर सकते हैं:
$ javac com/example/HelloWorld.java
यह "कॉम / उदाहरण / HelloWorld.class" नामक एक फ़ाइल का उत्पादन करता है; संकलन के बाद, फ़ाइल संरचना इस तरह दिखना चाहिए:
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
----HelloWorld.class
हम निम्नानुसार आवेदन चला सकते हैं:
$ java com.example.HelloWorld
Hello world!
इस उदाहरण से ध्यान देने योग्य अतिरिक्त बिंदु हैं:
- निर्देशिका संरचना पैकेज नाम संरचना से मेल खाना चाहिए।
- जब आप क्लास चलाते हैं, तो फ़ुल क्लास नाम की आपूर्ति की जानी चाहिए; यानी "com.example.HelloWorld" "हैलोवर्ल्ड" नहीं।
- आपको वर्तमान निर्देशिका से जावा कोड को संकलित और चलाना नहीं है। हम इसे केवल चित्रण के लिए यहाँ कर रहे हैं।
'Javac' के साथ एक साथ कई फाइलों को संकलित करना।
यदि आपके आवेदन में कई स्रोत कोड फाइलें हैं (और सबसे अधिक!) तो आप उन्हें एक समय में एक संकलन कर सकते हैं। वैकल्पिक रूप से, आप पथनामों को सूचीबद्ध करके एक ही समय में कई फ़ाइलों को संकलित कर सकते हैं:
$ javac Foo.java Bar.java
या अपने कमांड शेल का फ़ाइल नाम वाइल्डकार्ड कार्यक्षमता का उपयोग करके ...।
$ javac *.java
$ javac com/example/*.java
$ javac */**/*.java #Only works on Zsh or with globstar enabled on your shell
यह वर्तमान निर्देशिका में सभी जावा स्रोत फ़ाइलों को "कॉम / उदाहरण" निर्देशिका में संकलित करेगा, और क्रमशः बाल निर्देशिकाओं में पुनरावृत्ति करेगा। एक तीसरा विकल्प फ़ाइल के रूप में स्रोत फ़ाइलनाम (और संकलक विकल्प) की एक सूची की आपूर्ति करना है। उदाहरण के लिए:
$ javac @sourcefiles
जहाँ sourcefiles
फ़ाइल शामिल है:
Foo.java
Bar.java
com/example/HelloWorld.java
नोट: इस तरह का संकलन कोड छोटे एक-व्यक्ति परियोजनाओं के लिए, और एक बार के कार्यक्रमों के लिए उपयुक्त है। इसके अलावा, जावा बिल्ड टूल का चयन करना और उसका उपयोग करना उचित है। वैकल्पिक रूप से, अधिकांश प्रोग्रामर एक जावा IDE (जैसे NetBeans , ग्रहण , IntelliJ IDEA ) का उपयोग करते हैं, जो "प्रोजेक्ट्स" की एक एम्बेडेड कंपाइलर और वृद्धिशील इमारत प्रदान करता है।
आमतौर पर 'जेवैक' विकल्पों का उपयोग किया जाता है
यहाँ javac
कमांड के लिए कुछ विकल्प हैं जो आपके लिए उपयोगी होने की संभावना है
-
-d
विकल्प ".class" फ़ाइलों को लिखने के लिए एक गंतव्य निर्देशिका सेट करता है। -
-sourcepath
विकल्प एक स्रोत कोड खोज पथ सेट करता है। -
-cp
या-classpath
विकल्प बाहरी और पहले से संकलित कक्षाएं ढूँढने के लिए खोज पथ सेट करता है। Classpath के बारे में अधिक जानकारी और इसे निर्दिष्ट करने के तरीके के लिए, Classpath विषय का संदर्भ लें। -
-version
विकल्प संकलक के संस्करण की जानकारी प्रिंट करता है।
संकलक विकल्पों की एक और पूरी सूची एक अलग उदाहरण में वर्णित की जाएगी।
संदर्भ
के लिए निश्चित संदर्भ javac
आदेश है के लिए Oracle मैनुअल पृष्ठ javac
।
जावा के एक अलग संस्करण के लिए संकलन
जावा प्रोग्रामिंग लैंग्वेज (और इसके रनटाइम) को इसके आरंभिक सार्वजनिक रिलीज के बाद से कई बदलावों से गुजरना पड़ा है। इन परिवर्तनों में शामिल हैं:
- जावा प्रोग्रामिंग भाषा सिंटैक्स और शब्दार्थ में परिवर्तन
- जावा मानक श्रेणी के पुस्तकालयों द्वारा प्रदान किए गए एपीआई में परिवर्तन।
- जावा (बायटेकोड) अनुदेश सेट और क्लासफाइल प्रारूप में परिवर्तन।
बहुत कम अपवादों के साथ (उदाहरण के लिए enum
कीवर्ड, कुछ "आंतरिक" वर्गों आदि में परिवर्तन), ये परिवर्तन पीछे की ओर संगत हैं।
- जावा टूलचैन के पुराने संस्करण का उपयोग करके संकलित किया गया एक जावा प्रोग्राम नए संस्करण जावा प्लेटफॉर्म पर बिना रीकैपिलेशन के चलेगा।
- एक जावा प्रोग्राम जो कि जावा के पुराने संस्करण में लिखा गया था, एक नए जावा कंपाइलर के साथ सफलतापूर्वक संकलित होगा।
पुराने जावा को नए संकलक के साथ संकलित करना
अगर आपको नए प्लेटफॉर्म पर चलने के लिए एक नए जावा प्लेटफॉर्म पर पुराने जावा कोड को (फिर से) संकलित करने की आवश्यकता है, तो आपको आम तौर पर कोई विशेष संकलन झंडे देने की आवश्यकता नहीं है। कुछ मामलों में (जैसे यदि आपने पहचान के रूप में enum
का उपयोग किया था) तो आप नए सिंटैक्स को अक्षम करने के लिए -source
विकल्प का उपयोग कर सकते हैं। उदाहरण के लिए, निम्न वर्ग दिया गया है:
public class OldSyntax {
private static int enum; // invalid in Java 5 or later
}
जावा 5 संकलक (या बाद में) का उपयोग करके कक्षा को संकलित करने के लिए निम्नलिखित आवश्यक है:
$ javac -source 1.4 OldSyntax.java
एक पुराने निष्पादन मंच के लिए संकलन
यदि आपको पुराने जावा प्लेटफॉर्म पर चलने के लिए जावा को संकलित करने की आवश्यकता है, तो सबसे सरल तरीका यह है कि आप जिस पुराने संस्करण का समर्थन करना चाहते हैं, उसके लिए एक JDK स्थापित करें, और अपने बिल्ड में उस JDK के संकलक का उपयोग करें।
आप एक नए जावा कंपाइलर के साथ भी संकलन कर सकते हैं, लेकिन जटिल हैं। सबसे पहले, वहाँ कुछ महत्वपूर्ण पूर्व शर्त है कि संतुष्ट होना चाहिए:
- आपके द्वारा संकलित किया जाने वाला कोड जावा भाषा के निर्माणों का उपयोग नहीं करना चाहिए जो कि आपके द्वारा लक्षित किए जा रहे जावा के संस्करण में उपलब्ध नहीं थे।
- कोड मानक जावा कक्षाओं, फ़ील्ड्स, विधियों पर निर्भर नहीं होना चाहिए और इसी तरह पुराने प्लेटफार्मों में उपलब्ध नहीं थे।
- थर्ड पार्टी लाइब्रेरी जो कोड पर निर्भर करती है, उसे पुराने प्लेटफॉर्म के लिए भी बनाया जाना चाहिए और संकलन-समय और रन-टाइम पर उपलब्ध होना चाहिए।
पूर्व शर्त पूरी होने के बाद, आप -target
विकल्प का उपयोग करके एक पुराने प्लेटफ़ॉर्म के लिए कोड को फिर से -target
। उदाहरण के लिए,
$ javac -target 1.4 SomeClass.java
उपर्युक्त वर्ग को बाइटकोड के उत्पादन के लिए संकलित करेगा जो जावा 1.4 या बाद में जेवीएम के साथ संगत है। (वास्तव में, -source
विकल्प का अर्थ संगत- -target
, इसलिए javac -source 1.4 ...
का समान प्रभाव होगा। -source
और -target
बीच का संबंध Oracle दस्तावेज़ीकरण में वर्णित है।)
कहा जाता है कि, यदि आप बस -target
या -source
उपयोग करते हैं, तो आप अभी भी संकलक की JDK द्वारा प्रदान की जाने वाली मानक कक्षा के पुस्तकालयों के खिलाफ संकलन करेंगे। यदि आप सावधान नहीं हैं, तो आप सही बाइटकोड संस्करण के साथ कक्षाएं समाप्त कर सकते हैं, लेकिन एपीआई पर निर्भरता के साथ जो उपलब्ध नहीं हैं। समाधान -bootclasspath
विकल्प का उपयोग करना है। उदाहरण के लिए:
$ javac -target 1.4 --bootclasspath path/to/java1.4/rt.jar SomeClass.java
रनटाइम पुस्तकालयों के एक वैकल्पिक सेट के खिलाफ संकलन करेगा। यदि संकलित की जा रही कक्षा में नए पुस्तकालयों पर (आकस्मिक) निर्भरता है, तो यह आपको संकलन त्रुटियां देगा।