कमांड लाइन से एक JAR फ़ाइल चलाएँ और classpath निर्दिष्ट करें


115

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

मैंने कोशिश की:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

आदि...

प्रत्येक यह कहते हुए एक त्रुटि देता है:

Error: Could not find or load main class ....

या NoClassDefFoundErrorसंकेत देता है कि पुस्तकालय नहीं मिल रहे हैं।

मैंने JAR फ़ाइल को रीमेक करने की भी कोशिश की और libनिर्देशिका और सामग्री को शामिल किया , लेकिन फिर भी कोई पासा नहीं ...

मैं कमांड लाइन से एक JAR फ़ाइल को कैसे निष्पादित कर सकता हूं और उपयोग करने के लिए क्लासपैथ निर्दिष्ट कर सकता हूं?


जवाबों:


204

जब आप निर्दिष्ट करते हैं -jarतो -cpपैरामीटर को नजरअंदाज कर दिया जाएगा।

से प्रलेखन :

जब आप इस विकल्प का उपयोग करते हैं, तो JAR फ़ाइल सभी उपयोगकर्ता वर्गों का स्रोत होती है, और अन्य उपयोगकर्ता वर्ग पथ सेटिंग्स को अनदेखा कर दिया जाता है।

आप जार फ़ाइलों को अन्य जार फ़ाइल में "शामिल" नहीं कर सकते हैं (आपको उनकी सामग्री निकालने और अपनी .arass फ़ाइलों को अपनी जार फ़ाइल में डालने की आवश्यकता होगी)

आपके पास दो विकल्प हैं:

  1. libनिर्देशिका से सभी जार फ़ाइलों को प्रकट में शामिल करें (आप वहाँ रिश्तेदार पथ का उपयोग कर सकते हैं)
  2. का उपयोग कर कमांडलाइन पर सब कुछ ( अपने जार सहित ) निर्दिष्ट करें -cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

22
; इसके बजाय: अगर आप java -cp MyJar.jar के रूप में विंडोज़ का उपयोग करते हैं, तो lib / * com.somepackage.subpackage.Main
त्रुटि

आप जार फ़ाइलों को अन्य जार फ़ाइल में "शामिल" नहीं कर सकते। जरूर आप कर सकते हो। यदि यह आंतरिक उपयोग के लिए है (यानी, आप उपयोगकर्ता से कुछ तकनीकी कौशल आदि की उम्मीद करते हैं) तो आप केवल उस चरण 1 से पूछ सकते हैं, जार को चलाने के प्रयास से पहले, चलाना है unzip MyJar.jar lib/*.jar। फिर, जैसा कि आप सुझाव देते हैं, वे चला सकते हैंjava -cp MyJar.jar:lib/* ...
रोजर

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

मुझे पता लगाने के लिए कुछ समय लगा। और एक log4j फ़ाइल को स्पष्ट रूप से लोड करने के लिए लगभग 6 लाइनें लेता है। एक और जावा बग जो कभी तय नहीं होगा।
टंटेबल

1
ध्यान दें कि मैनिफ़ेस्ट क्लास-पाथ का उपयोग केवल जार फ़ाइलों को लोड करने के लिए किया जा सकता है। इसका उपयोग log4j3.xml देखने के लिए नहीं किया जा सकता है, उदाहरण के लिए। मुझे अच्छा मिला।
Tuntable

34

जार फ़ाइल चलाएँ और इस तरह एक वर्ग पथ निर्दिष्ट करें:

java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar उस JAR का पूरा नाम है जिसे आप निष्पादित करना चाहते हैं

libs/* अपने निर्भरता JARs के लिए एक रास्ता है

com.test.AppJAR से वर्ग का पूरी तरह से योग्य नाम है जिसमें main(String[])विधि है

जार और आश्रित जार के पास अनुमतियाँ होनी चाहिए।


10

आप यूनिक्स शेल में ये कर सकते हैं:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

आप विंडो में ये कर सकते हैं

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main

4

वैकल्पिक रूप से, यदि आपको पसंद है, तो वर्ग-पथ और मुख्य-वर्ग को निर्दिष्ट करने के लिए प्रकट का उपयोग करें, इसलिए तब आपको -cpमुख्य वर्ग का उपयोग करने या निर्दिष्ट करने की आवश्यकता नहीं है । आपके मामले में इसमें इस तरह की लाइनें होंगी:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

दुर्भाग्य से आपको प्रकट में प्रत्येक जार को स्पेल करने की आवश्यकता होती है (एक बिग्गी नहीं जैसा कि आप केवल एक बार करते हैं, और आप फ़ाइल बनाने के लिए स्क्रिप्ट का उपयोग कर सकते हैं या एएनटी या मावेन या ग्रैडल जैसे बिल्ड टूल का उपयोग कर सकते हैं)। और संदर्भ आपको चलाने के लिए एक रिश्तेदार या निरपेक्ष निर्देशिका होना चाहिए java -jar MyJar.jar

फिर इसके साथ निष्पादित करें

java -jar MyJar.jar

मुझे लगता है कि क्लास-पाथ को बाहरी जार के भीतर फाइलों को संदर्भित करने की आवश्यकता है। मुझे यह सामान्य रूप से काम करने के लिए नहीं मिला, MyJar.jar के बाहर फ़ाइलों को कॉन्फ़िगर करने के लिए।
टंटेबल

0

आप arp के साथ classpath सहित जार को पुनः लोड करने के लिए एक Runtime.getRuntime.exec (कमांड) कर सकते हैं।

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