"जावा-सीपी" और "जावा -जर" के बीच अंतर?


118

जावा एप्लिकेशन को चलाने में
java -cp CLASSPATHऔर के बीच क्या अंतर है java -jar JAR_FILE_PATH? जावा एप्लिकेशन चलाने के लिए उनमें से एक को दूसरे के लिए पसंद किया जाता है? मेरा मतलब है कि इनमें से कौन सा तरीका जेवीएम (उनके मशीन संसाधनों के उपयोग के अनुसार) के लिए अधिक महंगा है?

एप्लिकेशन को चलाने के लिए जेवीएम किसके कारण अधिक धागे उगल देगा?

जवाबों:


97

मैं एक जावा एप्लिकेशन को शुरू करने के लिए पहला संस्करण पसंद करता हूं, क्योंकि इसमें कम नुकसान होते हैं ("क्लासपाथ नरक में आपका स्वागत है")। दूसरे को एक निष्पादन योग्य जार फ़ाइल की आवश्यकता होती है और उस एप्लिकेशन के लिए क्लासपैथ को जार के प्रकट होने के अंदर परिभाषित करना होता है (अन्य सभी क्लासपैथ घोषणा को चुपचाप अनदेखा कर दिया जाएगा ...)। तो दूसरे संस्करण के साथ आपको जार में देखना होगा, मेनिफ़ेस्ट पढ़ें और यह पता करने की कोशिश करें कि क्या क्लासपैथ प्रविष्टियाँ वैध हैं जहाँ से जार को संग्रहीत किया जाता है ... यह परिहार्य है।

मैं किसी भी प्रदर्शन लाभ या तो संस्करण के लिए नुकसान की उम्मीद नहीं है। यह सिर्फ जेवीएम बता रहा है कि मुख्य धागे के लिए किस वर्ग का उपयोग करना है और यह कहां पुस्तकालयों को ढूंढ सकता है।


धागे के बारे में क्या? आवेदन को चलाने की कोशिश करते समय क्या वे धागे जेवीएम स्पॉन की संख्या के मामले में समान हैं?
रेजा

1
हाँ। दोनों संस्करण मुख्य विधि का पता लगाएंगे और एक ही धागे के साथ निष्पादित करेंगे। पहला संस्करण एक तर्क के रूप में क्लासनाम पास करता है, दूसरे संस्करण के साथ, जेवीएम इसे मेनफेस्ट के अंदर मिलेगा।
एंड्रियास डॉक

@Andreas_D कृपया इस पोस्ट पर एक नज़र डालेंगे , मुझे लगता है कि मैं एक गलत तरीके से -pp का उपयोग कर रहा हूं, और मैं अपनी गलती को सुधारना नहीं चाहता।
फू डीएल

60

इस -cpतर्क के साथ कि आप अतिरिक्त कक्षाओं या पुस्तकालयों को क्लासपाथ यानी पथ (ओं) प्रदान करते हैं जिन्हें आपके प्रोग्राम को संकलित या चलाने के लिए आवश्यक हो सकता है। अपने साथ -jarनिष्पादन योग्य JAR फ़ाइल निर्दिष्ट करें जिसे आप चलाना चाहते हैं।

आप उन दोनों को निर्दिष्ट नहीं कर सकते। यदि आप चलाने की कोशिश करते हैं java -cp folder/myexternallibrary.jar -jar myprogram.jarतो यह वास्तव में काम नहीं करेगा। उस JAR के लिए क्लासपैथ को उसके घोषणापत्र में निर्दिष्ट किया जाना चाहिए, न कि एक -cpतर्क के रूप में ।

आप इस बारे में और अधिक प्राप्त कर सकते हैं यहाँ और यहाँ

पुनश्च: -cpऔर -classpathपर्यायवाची हैं।


मेरी चिंता संसाधनों के बारे में है? क्या उनके द्वारा उपयोग किए जाने वाले संसाधनों के बीच अंतर है?
रेजा

@Hesam यदि आप प्रदर्शन के बीच अंतर के बारे में पूछ रहे हैं -cpऔर -classpath, नहीं, तो कोई अंतर नहीं है।
रादु मुराज़े

1
नहीं! मेरा मतलब था -cp (or -classpath) और -jar के बीच अंतर का अंतर
Reza

2
@Hesam आपके साथ -jarयह निर्दिष्ट करता है कि आप किस निष्पादन योग्य JAR को चलाना चाहते हैं। आपके साथ -cpअतिरिक्त कक्षाओं / लाइब्रेरी के लिए पथ (ओं) को निर्दिष्ट करें जिन्हें आपके कार्यक्रम की आवश्यकता हो सकती है। 2 के बहुत अलग उद्देश्य हैं।
रादु मुराज़े

@RaduMurzea, क्या आप इसे नहीं होगा मतलब है वास्तव में काम करते हैं जब हम उन्हें गठबंधन? जैसेjava -jar PATH -cp PATH2
पचेरियर

18

का उपयोग करते समय java -cpआपको पूरी तरह से योग्य मुख्य वर्ग नाम प्रदान करना आवश्यक है, जैसे

java -cp com.mycompany.MyMain

java -jar myjar.jarअपनी जार फ़ाइल का उपयोग करते समय फ़ोल्डर में जार फ़ाइल में शामिल मैनिफ़ेस्ट .ff के माध्यम से मुख्य वर्ग के बारे में जानकारी प्रदान करनी चाहिए META-INF:

Main-Class: com.mycompany.MyMain


कृपया इस पोस्ट पर एक नज़र डालेंगे , मुझे लगता है कि मैं -cp का गलत तरीके से उपयोग कर रहा हूं, और मुझे अपनी गलती को सुधारने का तरीका नहीं है।
फू डीएल

10

यदि आप क्लासपाथ में सभी कोड निर्दिष्ट करना चाहते हैं, तो जावा-क्लास क्लासपीस आवश्यक है। यह डिबगिंग कोड के लिए उपयोगी है।

जबर्दस्त निष्पादन योग्य प्रारूप: java -jar JarFileका उपयोग किया जा सकता है यदि आप एक छोटी कमांड के साथ ऐप शुरू करना चाहते हैं। आप क्लास-पाथ प्रविष्टि में अंतरिक्ष से अलग जार का उपयोग करके अपने MANIFEST में अतिरिक्त निर्भर जार फ़ाइलों को निर्दिष्ट कर सकते हैं, जैसे:

Class-Path: mysql.jar infobus.jar acme/beans.jar

दोनों प्रदर्शन के मामले में तुलनीय हैं।


कृपया इस पोस्ट पर एक नज़र डालेंगे , मुझे लगता है कि मैं -cp का गलत तरीके से उपयोग कर रहा हूं, और मुझे अपनी गलती को सुधारने का तरीका नहीं है।
फू डीएल

2

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

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


1

प्रदर्शन के मामले में कोई अंतर नहीं होगा। Java - cp का उपयोग करके हम java क्लास की फाइल चलाने के लिए classpath में आवश्यक कक्षाएं और jar का उल्लेख कर सकते हैं।

यदि यह एक निष्पादन योग्य जार फ़ाइल है। जब java -jar कमांड का उपयोग किया जाता है, jvm उस वर्ग को खोजता है जिसे जार फ़ाइल के अंदर /META-INF/MANIFEST.MF फ़ाइल से चलाने की आवश्यकता होती है।

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