जावा क्लासपथ के भीतर एक निर्देशिका में सभी जार शामिल हैं


1018

क्या क्लास जार में एक निर्देशिका के भीतर सभी जार फ़ाइलों को शामिल करने का एक तरीका है?

मैं कोशिश कर रहा हूँ java -classpath lib/*.jar:. my.package.Programऔर यह निश्चित रूप से उन जार में वर्ग फ़ाइलों को खोजने में सक्षम नहीं है। क्या मुझे प्रत्येक जार फ़ाइल को अलग से classpath में जोड़ने की आवश्यकता है?


3
क्षमा करें, मैंने इसे कभी स्वीकार नहीं किया। यह एक सामुदायिक विकि होना चाहिए। कभी भी दिए गए उत्तरों में से एक का उपयोग नहीं किया। मेरा मानना ​​है कि मैंने एक शेल स्क्रिप्ट बनाई है जो सिर्फ लिब / डायरेक्टरी को स्कैन करती है और फ़ाइल नामों को पार्स करने से क्लासपाथ बनाया है।
क्रिस सेरा

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


1
विंडोज में वाइल्डकार्ड प्रसंस्करण के साथ समस्या है। stackoverflow.com/questions/11607873/…
Mykhaylo Adamovych

6
संक्षिप्त उत्तर: (1) .jarभाग को गिराएं , (2) में कम से कम 2 भाग; होने चाहिए , जो कि विंडोज पर अलग होता है (जो आमतौर पर :कहीं और होता है)। उदाहरण के लिए:java -classpath ".;lib/*" Program
एवगेनी सर्गेव

जवाबों:


1159

जावा 6 या उसके बाद का उपयोग करते हुए, क्लासपैथ विकल्प वाइल्डकार्ड का समर्थन करता है। निम्नलिखित पर ध्यान दें:

  • सीधे उद्धरण का उपयोग करें ( ")
  • का उपयोग करें *, नहीं*.jar

खिड़कियाँ

java -cp "Test.jar;lib/*" my.package.MainClass

यूनिक्स

java -cp "Test.jar:lib/*" my.package.MainClass

यह विंडोज के समान है, लेकिन :इसके बजाय उपयोग करता है ;। यदि आप वाइल्डकार्ड का उपयोग नहीं कर सकते हैं, bashतो निम्नलिखित सिंटैक्स की अनुमति देता है (जहां libसभी जावा संग्रह फ़ाइलों वाली निर्देशिका है):

java -cp $(echo lib/*.jar | tr ' ' ':')

(ध्यान दें कि क्लासपाथ का उपयोग करना -jarविकल्प के साथ असंगत है । यह भी देखें: कमांड प्रॉम्प्ट से कई क्लासपैथ पुस्तकालयों के साथ जार फ़ाइल निष्पादित करें )

वाइल्डकार्ड को समझना

से क्लासपाथ दस्तावेज़:

क्लास पाथ एंट्रीज में बेसनेम वाइल्डकार्ड कैरेक्टर हो सकता है *, जिसे डायरेक्टरी .jarया एक्सटेंशन वाली सभी फाइलों की सूची निर्दिष्ट करने के बराबर माना जाता है .JAR। उदाहरण के लिए, वर्ग पथ प्रविष्टि foo/*foo नाम की निर्देशिका में सभी JAR फ़ाइलों को निर्दिष्ट करती है। एक क्लासपैथ प्रविष्टि जिसमें *मौजूदा निर्देशिका में सभी जार फ़ाइलों की सूची शामिल है।

क्लास पथ प्रविष्टि जिसमें *सम्‍मिलित है क्‍लास फ़ाइलों से मेल नहीं खाती। एकल निर्देशिका foo में दोनों वर्गों और JAR फ़ाइलों का मिलान करने के लिए, foo;foo/*या तो उपयोग करें foo/*;foo। चुना गया आदेश यह निर्धारित करता है कि क्या fooJAR फ़ाइलों से पहले वर्ग और संसाधन लोड किए गए हैं fooया इसके विपरीत।

उपनिर्देशिका को पुनरावर्ती रूप से नहीं खोजा जाता है। उदाहरण के लिए, foo/*केवल में जार फ़ाइलों के लिए दिखता है foo, में नहीं foo/bar, foo/bazआदि

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

वाइल्डकार्ड्स का विस्तार एक कार्यक्रम की मुख्य विधि के आह्वान से पहले, देर से करने के बजाय, क्लास-लोडिंग के दौरान ही किया जाता है। वाइल्डकार्ड वाले इनपुट क्लास पथ के प्रत्येक तत्व को नाम निर्देशिका में JAR फ़ाइलों को एन्यूमरेट करके उत्पन्न (संभवतः खाली) अनुक्रम द्वारा प्रतिस्थापित किया जाता है। उदाहरण के लिए, यदि निर्देशिका fooसम्‍मिलित है a.jar, b.jarऔर c.jar, तब वर्ग पथ foo/*में विस्तार किया जाता है foo/a.jar;foo/b.jar;foo/c.jar, और वह स्ट्रिंग सिस्टम गुण का मान होगा java.class.path

CLASSPATHवातावरण चर से किसी भी अलग तरह से व्यवहार नहीं कर रहा है -classpath(या -cp) कमांड लाइन विकल्प। यही है, इन सभी मामलों में वाइल्डकार्ड सम्मानित हैं। हालांकि, श्रेणी पथ वाइल्डकार्ड को Class-Path jar-manifestहेडर में सम्मानित नहीं किया जाता है ।

नोट: जावा 8 में एक ज्ञात बग के कारण, विंडोज़ के उदाहरणों में एक पीछे चल रही प्रविष्टियों का उपयोग एक पीछे चल रहे तारांकन चिह्न के साथ करना होगा: https://bugs.openjdk.java.net/browse/JDK/8131329


2
सुविधा खराब रूप से प्रलेखित है, और ऐसा लगता है कि कुछ कम-से-स्पष्ट पूर्व-शर्तों की आवश्यकता है ताकि वे वांछित रूप से काम कर सकें।
एलेक्स आर

1
अंतिम बैश / ट्रिक के लिए +1। जावा / JamVM यहां वर्किंग डायरेक्टरी के बाहर के रास्तों के लिए वाइल्डकार्ड पसंद नहीं करता है, लेकिन शेल वाइल्डकार्ड और trकार्यों का उपयोग करके प्रत्येक JAR को स्पष्ट रूप से संदर्भित करता है!
supr

1
मेरे पास java -classpath /jars/*:/anotherJarsDir/* com.test.MyClassबिना किसी उद्धरण के एक कमांड है और यह ठीक काम करता है। मैं सोच रहा हूं कि शेल इसका विस्तार क्यों नहीं कर रहा है और इसे समाप्त कर रहा है?
येलवोन

3
इसके अलावा ~-cp का उपयोग न करें
सोहेल Si

1
आपके विंडोज़ उदाहरण java 8 या उससे पहले के साथ काम नहीं करते हैं, लेकिन इस classpath के साथ काम करेंगे: Test.jar; lib \ * ... फॉरवर्ड स्लैश ठीक है सिवाय इसके कि तारांकन और कुछ अन्य लोगों से पहले ... बग्स .openjdk
दार्शनिक

226

खिड़कियों के नीचे यह काम करता है:

java -cp "Test.jar;lib/*" my.package.MainClass

और यह काम नहीं करता है:

java -cp "Test.jar;lib/*.jar" my.package.MainClass

* .jar को नोटिस करें, इसलिए * वाइल्डकार्ड अकेले इस्तेमाल किया जाना चाहिए


लिनक्स पर, निम्नलिखित कार्य करता है:

java -cp "Test.jar:lib/*" my.package.MainClass

विभाजक अर्धविराम के बजाय कॉलन हैं।


17
एकदम सही जवाब। ध्यान देने योग्य 2 महत्वपूर्ण बातें: 1) उद्धरण और 2 का प्रयोग करें * केवल * का उपयोग करें। * नहीं।
Wim Deblauwe

4
एक साल और 8 महीने बाद, UNIX संस्करण को शामिल करने के लिए मैंने जो संपादन किया, उसने मुझे फिर से बचा लिया। :) अजीब बात है कि यह कैसे के साथ *.jarलेकिन केवल के साथ मेरी जार फ़ाइलों को पहचान नहीं होगा *
jmort253

मैंने पाया कि क्लासपैथ का क्रम महत्वपूर्ण है (लेकिन मुझे नहीं पता क्यों)। जब तक मैंने क्लासपाथों के ऑर्डर को स्विच नहीं किया तब तक मुझे त्रुटियाँ मिल रही थीं।
user13107

@ jmort253, बात यह है, यह शेल * विस्तार नहीं है, लेकिन वाइल्डकार्ड जावा को क्लासपाथ पार्स कर रहा है, * देखकर और वाइल्डकार्ड में भरना
सेबस्टियन

1
@ एसबेस्टियनगोडलेट - ये, मुझे रेगेक्स वाइल्डकार्ड और इस संकेतन के बीच बस भ्रम हो रहा है, जो मुझे लगता ही नहीं है। अधिकतर, जो मुझे बचा रहा है वह :एक मंच ;पर और दूसरे पर अंतर को जान रहा है । :) मैं प्रति वर्ष लगभग एक बार कमांड लाइन से जावा के साथ संकलन करता हूं, बस यह याद रखने के लिए पर्याप्त नहीं है कि कष्टप्रद होने के लिए कितनी बार पर्याप्त है।
jmort253

67

हम एक मुख्य जार फ़ाइल को तैनात करके इस समस्या को हल करते हैं myapp.jarजिसमें एक प्रकट ( Manifest.mf) फ़ाइल होती है जो अन्य आवश्यक जार के साथ एक क्लासपैथ को निर्दिष्ट करती है, जो तब उसके साथ तैनात होती है। इस मामले में, आपको केवल java -jar myapp.jarकोड चलाते समय घोषित करना होगा ।

इसलिए यदि आप मुख्य jarको कुछ निर्देशिका में तैनात करते हैं , और फिर उसके libनीचे निर्भर जार को एक फ़ोल्डर में डालते हैं, तो यह प्रकट होता है:

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

NB: यह प्लेटफ़ॉर्म-इंडिपेंडेंट है - हम UNIX सर्वर पर या विंडोज पीसी पर लॉन्च करने के लिए समान जार का उपयोग कर सकते हैं।


यह बहुत से लोगों के लिए काम करता है, हालाँकि, जावा को स्पष्ट रूप से यहाँ प्रकट फ़ाइल में क्लास-पथ प्रविष्टियों को अनदेखा करना प्रतीत होता है। हम क्लास -पैथ का उपयोग करके "lib / *" मैन्युअल रूप से जोड़ने के बिना एप्लिकेशन को नहीं चला सकते हैं। कोई विचार?
राकू

6
oxbow_lakes का उत्तर पूरी तरह से सही नहीं है; क्लास-पाथ चीज़ को सम्मानित किया जाता है (और केवल जो सम्मानित किया जाता है; -cp / -classpath को अनदेखा किया जाता है!) यदि आप इस जार को java-jer myapp.jar से शुरू करते हैं। मैं मानता हूं कि oxbow_lakes लिखने का मतलब यह था कि जब उन्होंने 'java -classpath myapp.jar' लिखा था।
rzwitserloot

47

उबंटू 10.04 पर मेरा समाधान जावा-सन 1.6.0_24 का उपयोग करके "लिब" निर्देशिका में सभी जार हैं:

java -cp।: lib / * my.main.Class

यदि यह विफल रहता है, तो निम्न कमांड काम करना चाहिए (सभी * .jars को लिबरल डायरेक्टरी में क्लासपैट परम के लिए प्रिंट करता है)

java -cp $ (in lib / *। jar के लिए; इको-एन $ i:; किया)। my.main.Class

4
एक मजेदार नोट। java -cp lib / * my.main.Class हमेशा विफल रहेगा क्योंकि शेल glob का विस्तार lib / * है, जबकि java -cp।: lib / * my.main.Class नहीं होगा क्योंकि: lib / * एक मान्य वर्ब नहीं है। पथ। कुछ समय के लिए ध्यान दें कि
एल्बफैन

1
यह काम नहीं करता; linux का विस्तार होगा । आप कोशिश कर सकते हैं: java -cp '।: lib / ' और जो ठीक काम करता है (एकल उद्धरणों पर ध्यान दें! यह दोहरे उद्धरण चिह्नों के साथ नहीं होगा!)। असल में,: lib / * काम कर सकता है यदि वह बृहदान्त्र के कारण एक वैध ग्लोब नहीं है, लेकिन यह थोड़ा iffy लगता है। मैं उद्धरण जोड़ूंगा। एकल उद्धरण सामग्री के किसी भी भाग को न छूने के लिए बैश बताते हैं।
rzwitserloot

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

36

संक्षिप्त जवाब: java -classpath lib/*:. my.package.Program

ओरेकल classpaths में वाइल्डकार्ड का उपयोग करने पर प्रलेखन प्रदान करता है जावा 6 के लिए यहाँ और यहाँ जावा 7 के लिए , अनुभाग शीर्षक के तहत समझौता वर्ग पथ वाइल्डकार्ड । (जैसा कि मैं इसे लिखता हूं, दो पृष्ठों में एक ही जानकारी होती है।) यहां पर प्रकाश डाला गया है:

  • सामान्य तौर पर, दिए गए निर्देशिका में सभी JAR को शामिल करने के लिए, आप वाइल्डकार्ड *( नहीं *.jar ) का उपयोग कर सकते हैं ।

  • वाइल्डकार्ड केवल JAR से मेल खाता है, न कि क्लास फाइल्स से; किसी निर्देशिका में सभी कक्षाएं प्राप्त करने के लिए, बस निर्देशिका नाम पर कक्षा की प्रविष्टि समाप्त करें।

  • उपरोक्त दोनों विकल्पों को एक निर्देशिका में सभी JAR और वर्ग फ़ाइलों को शामिल करने के लिए जोड़ा जा सकता है, और सामान्य वर्गपाठ की पूर्ववर्ती नियम लागू होते हैं। उदाहरण के लिए-cp /classes;/jars/*

  • वाइल्डकार्ड उपनिर्देशिकाओं में JARs की खोज नहीं करेगा ।

  • यदि आप CLASSPATHसिस्टम प्रॉपर्टी -cpया -classpathकमांड लाइन झंडे का उपयोग करते हैं तो उपरोक्त बुलेट पॉइंट सही हैं । हालाँकि, यदि आप Class-PathJAR मेनिफ़ेस्ट हेडर का उपयोग करते हैं (जैसा कि आप एक चींटी बिल्ड फ़ाइल के साथ कर सकते हैं), वाइल्डकार्ड को सम्मानित नहीं किया जाएगा।

हां, मेरा पहला लिंक वही है जो शीर्ष स्कोरिंग उत्तर में प्रदान किया गया है (जिसमें मुझे ओवरटेक करने की कोई उम्मीद नहीं है), लेकिन यह उत्तर लिंक से परे बहुत स्पष्टीकरण प्रदान नहीं करता है। चूंकि इन दिनों स्टैक ओवरफ्लो पर उस तरह का व्यवहार हतोत्साहित किया जाता है , मैंने सोचा कि मैं इस पर विस्तार करूंगा।


मेरी समस्या lib / * के बजाय lib / * jar के साथ थी। बहुत बहुत धन्यवाद यह तय है। मैंने देखा कि इसके बीच एक अंतर है: और; लेकिन यह मेरे परीक्षण-कई-परिवर्तन-पर-एक ही तरह की चीज हो सकती है।
आईड एब्राहिम

* और * .jar के बीच अंतर पर जोर देने के लिए धन्यवाद
बुरहान अलकन

36

विंडोज :

 java -cp file.jar;dir/* my.app.ClassName

लिनक्स :

 java -cp file.jar:dir/* my.app.ClassName

अनुस्मारक:
- विंडोज पथ विभाजक है ;
- लिनक्स पथ विभाजक है :
- विंडोज में अगर cp तर्क में सफेद स्थान नहीं है, तो "उद्धरण वैकल्पिक" है


विंडोज़ का उदाहरण java 8 और इससे पहले के लिए काम नहीं करता है: बगसोपेनजडक.जावा.नेट.ब्राउज़
जेडीके

शायद खुले JDK के लिए काम नहीं करता है, मैं इसका परीक्षण करूंगा और मैं यहां बात करूंगा
Wender

क्षमा करें, मैंने हॉटस्पॉट के साथ परीक्षण किया और मुझे लगा कि ओपनजेडके के साथ काम करता है।
Wender

खिड़कियों के नीचे ओरेकल जावा को आगे स्लैश के बजाय तारांकन से पहले बैकस्लैश की आवश्यकता होती है, हालांकि मैंने सबसे हाल ही में या वैकल्पिक जावा संस्करणों का फिर से परीक्षण नहीं किया है।
दर्शन


34

मेरे लिए यह विंडोज़ में काम करता है।

java -cp "/lib/*;" sample

लिनक्स के लिए

java -cp "/lib/*:" sample

मैं जावा 6 का उपयोग कर रहा हूं


खिड़कियों उदाहरण जावा 6 के लिए काम किया है करने के लिए, हो सकता है जावा 7 लगता है, लेकिन नहीं जावा 8 के लिए (देखें bugs.openjdk.java.net/browse/JDK-8131329 )
philwalk


29

आप जावा http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html आज़मा सकते हैं-Djava.ext.dirs=jarDirectory

जावा चलाते समय बाहरी जार के लिए निर्देशिका


3
यह काम करता है, लेकिन ध्यान से देखें, -Djava.ext.dirs=-jar
Giovanni Funchal

5
java.ext.dirs क्लासपथ में एक सामान्य जार से बहुत अलग काम करेगा। इसकी उच्च प्राथमिकता और अनुमति है जो किसी भी तरह से बूटस्टैंप (rt.jar) में कक्षाओं को ओवरराइड करने में सक्षम होगा
डेनिस सी

धन्यवाद। 'जावा संस्करण "1.8.0_221" जावा (टीएम) एसई रनटाइम एनवायरनमेंट (बिल्ड 1.8.0_221-बी 27) जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम (25.221-बी 27, मिश्रित मोड का निर्माण) पर, केवल यह -D संस्करण कक्षा में पास होने का काम किया। पारंपरिक रूप नहीं था।
मैट कैम्पबेल

23

सही करें :

java -classpath "lib/*:." my.package.Program

गलत:

java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:."     my.package.Program
java -classpath "lib/*.jar:."  my.package.Program
java -classpath  lib/*:.       my.package.Program

9

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

फिर, आप कुछ इस तरह से निर्दिष्ट कर सकते हैं:

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

आपके लॉन्च बिल्ड फ़ाइल में, जो आपके एप्लिकेशन को सही क्लासपैथ के साथ लॉन्च करेगा।


9

यदि आप जावा 6 का उपयोग कर रहे हैं, तो आप क्लासपाथ में वाइल्डकार्ड का उपयोग कर सकते हैं।

अब क्लासपैथ परिभाषा में वाइल्डकार्ड का उपयोग करना संभव है:

javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java  -d build/classes

Ref: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-use-wildcards/


8

कृपया ध्यान दें कि विंडोज पर जावा 7 के लिए वाइल्डकार्ड विस्तार टूट गया है।

अधिक जानकारी के लिए इस StackOverflow समस्या की जाँच करें ।

वाइल्डकार्ड के ठीक बाद अर्धविराम लगाना है। java -cp "somewhere/*;"


6

उनके लिए जो इससे सम्बद्ध हो सकते हैं,

मुझे MSYS / MinGW शेल के तहत विंडोज पर यह अजीब व्यवहार मिला।

काम करता है:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

काम नहीं करता है:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

मुझे पूरा यकीन है कि वाइल्डकार्ड शेल द्वारा विस्तारित नहीं है, क्योंकि उदाहरण के लिए

$ echo './*'
./*

(इसे एक अन्य कार्यक्रम के साथ भी बनाया गया, बल्कि अंतर्निहित echoपरिणाम के साथ।)

मेरा मानना ​​है कि यह वह है javacजो इसे विस्तारित करने की कोशिश कर रहा है, और यह अलग तरह से व्यवहार करता है कि तर्क में अर्धविराम है या नहीं। सबसे पहले, यह उन सभी तर्कों को विस्तारित करने की कोशिश कर सकता है जो पथ की तरह दिखते हैं। और केवल तभी यह उन्हें पार्स करेगा, -cpकेवल निम्नलिखित टोकन लेने के साथ । (ध्यान दें कि com.comsol.aco_1.0.0.jarउस निर्देशिका में दूसरा JAR है।) यह सब एक अनुमान है।

ये है

$ javac -version
javac 1.7.0

5

उपरोक्त सभी समाधान बहुत अच्छा काम करते हैं यदि आप किसी भी आईडीई के बाहर जावा एप्लिकेशन को विकसित करते हैं और चलाते हैं जैसे कि ग्रहण या नेटबीन्स।

यदि आप विंडोज 7 पर हैं और जावा में डेवलपमेंट के लिए ग्रहण आईडीई का उपयोग करते हैं, तो आप एक्लिप्स के अंदर निर्मित क्लास फाइलों को चलाने के लिए कमांड प्रॉम्प्ट का उपयोग करते हुए मुद्दों में भाग सकते हैं।

उदाहरण के लिए ग्रहण में आपके स्रोत कोड में निम्नलिखित पैकेज पदानुक्रम है: edu.sjsu.myapp.Main.wava

मेन के लिए बाहरी निर्भरता के रूप में आपके पास json.jar है

जब आप ग्रहण के भीतर से Main.java चलाने की कोशिश करते हैं, तो यह बिना किसी समस्या के चलेगा।

लेकिन जब आप ग्रहण में Main.java को संकलित करने के बाद कमांड प्रॉम्प्ट का उपयोग करके इसे चलाने का प्रयास करते हैं, तो यह "ClassNotDef Error blah blah" कहकर कुछ अजीब त्रुटियों को शूट करेगा।

मुझे लगता है कि आप अपने स्रोत कोड की कार्यशील निर्देशिका में हैं !!

कमांड प्रॉम्प्ट से इसे चलाने के लिए निम्न सिंटैक्स का उपयोग करें:

  1. javac -cp "।; json.jar" Main.java

  2. java -cp "; json.jar" edu.sjsu.myapp.Main

    [याद मत करो। ऊपर]

ऐसा इसलिए है क्योंकि आपने Main.java को पैकेज edu.sjsu.myapp के अंदर रखा है और java.exe सटीक पैटर्न की तलाश करेगा।

आशा है ये मदद करेगा !!


4

खिड़कियों के लिए उद्धरण आवश्यक हैं और; विभाजक के रूप में इस्तेमाल किया जाना चाहिए। उदाहरण के लिए:

java -cp "target\\*;target\\dependency\\*" my.package.Main

4

संक्षिप्त रूप: यदि आपका मुख्य जार के भीतर है, तो आपको संभवतः अतिरिक्त '-पथ पाथो / yourJar / YourJarsName.jar' की आवश्यकता होगी ताकि इसे स्पष्ट रूप से काम करने के लिए घोषित किया जा सके (भले ही 'YourJarsName.jar' क्लासपाथ पर था) (या , 5 साल पहले पूछे गए मूल प्रश्न का उत्तर देने के लिए व्यक्त किया गया था: आपको प्रत्येक जार को स्पष्ट रूप से पुनर्वितरित करने की आवश्यकता नहीं है, लेकिन ऐसा लगता है, यहां तक ​​कि java6 के साथ आपको अपने स्वयं के जार को फिर से खोलने की आवश्यकता है ...)


लंबा फॉर्म: (मैंने इस बात को स्पष्ट कर दिया है कि मुझे आशा है कि जावा के लिए भी इंटरलेपर्स इस का उपयोग कर सकते हैं)

जैसे कई यहाँ मैं निर्यात करने के लिए ग्रहण का उपयोग कर रहा हूँ: (फ़ाइल-> निर्यात -> 'रन करने योग्य जार फ़ाइल')। Handling लाइब्रेरी हैंडलिंग ’ग्रहण (जूनो) ऑफर पर तीन विकल्प हैं:

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

आमतौर पर मैं ऑप्ट 2 का उपयोग करता था (और ऑप्ट 1 निश्चित रूप से टूट रहा था), हालांकि मैं जिस जार का उपयोग कर रहा हूं, उनमें से एक में मूल कोड मैंने "जंजीर" ट्रिक के साथ तोड़ दिया है जो उस विकल्प को चुनने पर ग्रहण का लाभ उठाता है। यहां तक ​​कि यह महसूस करने के बाद कि मुझे ऑप्ट 3 की आवश्यकता है, और फिर इस स्टैकऑवरफ्लो प्रविष्टि को ढूंढना, मुझे अभी भी यह पता लगाने में कुछ समय लगा कि मुझे अपना मुख्य ग्रहण कैसे शुरू करना है, इसलिए यहां मेरे लिए क्या काम किया गया, क्योंकि यह दूसरों के लिए उपयोगी है ...


यदि आपने अपने जार का नाम दिया है: "fooBarTheJarFile.jar" और सभी को dir को निर्यात करने के लिए सेट किया गया है: "/ theFlyly / QualPath / toYourChosenDir"।

(मतलब 'एक्सपोर्ट डेस्टिनेशन' फ़ील्ड पढ़ेगा: '/theFlyly/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')

आपके खत्म होने के बाद, आप ग्रहण पाएंगे, फिर सभी पुस्तकालयों को उस निर्यात निर्देशिका में 'fooBarTheJarFile_lib' नाम के एक फ़ोल्डर में डाल देता है, जिससे आपको कुछ ऐसा मिलता है:

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

तब आप अपने सिस्टम पर कहीं से भी लॉन्च कर सकते हैं:

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

(Java Newbies के लिए: 'package.path_to.the_class_with.your_main' घोषित पैकेज-पथ है जो आपको 'TheClassWithYourMain.java' के शीर्ष पर मिलेगा जिसमें वह फ़ाइल है जिसमें 'मुख्य (स्ट्रिंग [] args) {.. ।} 'जो आप बाहर के जावा से चलाना चाहते हैं)


ध्यान देने योग्य बात यह है कि आपके घोषित वर्गपथ पर जार की सूची के भीतर 'fooBarTheJarFile.jar' होना पर्याप्त नहीं है। आपको स्पष्ट रूप से '-जर' घोषित करने की आवश्यकता है, और उस जार के स्थान को फिर से घोषित करें।

इस ब्रेक की तरह:

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

रिश्तेदार पथ के साथ बहाल:

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(जावा संस्करण "1.6.0_27" का उपयोग करके; ubuntu 12.04 पर OpenJDK 64-बिट सर्वर VM के माध्यम से)


3

एकमात्र तरीका मुझे पता है कि इसे व्यक्तिगत रूप से कैसे करना है, उदाहरण के लिए:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

उम्मीद है की वो मदद करदे!


यह '08 में वापस आने का एकमात्र तरीका हो सकता है, लेकिन अब नहीं।
simo.3792

यह सबसे बुरी बात नहीं है। यह एक हैक है, लेकिन मेरे पास यह सेट है मेरे bashrcfor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Devon Peticolas

3

wepapp से कक्षा:

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

2

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


3
यह '08 में वापस आने का एकमात्र तरीका हो सकता है, लेकिन अब नहीं।
simo.3792

2

सेट करने में सक्षम होने के लिए एक सीधा समाधान / * -cp करने में सक्षम नहीं है, लेकिन मुझे उम्मीद है कि आप डायनामिक क्लास-पाथ्स और कामेच्छा निर्देशिकाओं के लिए स्थिति को थोड़ा आसान करने के लिए निम्न स्क्रिप्ट का उपयोग कर सकते हैं।

 libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 

लिनक्स के लिए स्क्रिप्टेड, विंडोज़ के लिए भी एक समान हो सकता है। यदि उचित निर्देशिका को "libDir2Scan4jars" इनपुट के रूप में प्रदान किया जाता है; स्क्रिप्ट सभी जार को स्कैन करेगी और एक क्लासपैथ स्ट्रिंग बनाएगी और इसे एक एनवी चर "tmpCLASSPATH" में निर्यात करेगी।


2

macOS, वर्तमान फ़ोल्डर

MacOS Mojave पर जावा 13 के लिए ...

यदि आपकी सभी .jarफाइलें एक ही फ़ोल्डर में हैं, cdतो अपनी वर्तमान कार्यशील निर्देशिका बनाने के लिए उपयोग करें । के साथ सत्यापित करें pwd

आपके लिए -classpathआपको सबसे पहले अपने ऐप के लिए JAR फाइल को सूचीबद्ध करना होगा । :एक सीमांकक के रूप में एक बृहदान्त्र वर्ण का उपयोग करना , एक *ही फ़ोल्डर में अन्य सभी JAR फ़ाइलों को प्राप्त करने के लिए तारांकन चिह्न जोड़ें । अंत में, अपनी mainविधि के साथ कक्षा का पूरा पैकेज नाम दें ।

उदाहरण के लिए, नाम के एक जार फ़ाइल में एक अनुप्रयोग के लिए my_app.jarएक साथ mainनाम की एक कक्षा में विधि Appनाम के एक पैकेज में com.example, एक ही फ़ोल्डर में कुछ की जरूरत जार के साथ:

java -classpath my_app.jar:* com.example.App

जावा 8 के लिए काम नहीं करता है
ग्रीशॉक

1

एक निर्देशिका संरचना की जड़ के रूप में एक जार फ़ाइल के बारे में सोचो। हां, आपको उन सभी को अलग से जोड़ना होगा।


1

क्लासपाथ को एक तरह से उपयुक्त कई जार और वर्तमान निर्देशिका की क्लास फ़ाइलों में सेट करें।

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH

0

मेरे पास एक फ़ोल्डर में कई जार हैं। नीचे दिए गए आदेश ने JDK1.8फ़ोल्डर में मौजूद सभी जार को शामिल करने के लिए मेरे लिए काम किया । कृपया ध्यान दें कि यदि आपके पास क्लासपाथ में जगह है तो उद्धरणों में शामिल करें

खिड़कियाँ

संकलन: javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java

चल रहा है: java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram

लिनक्स

संकलन: javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java

चल रहा है: java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram


-1

मैं जावा फ़ाइल को जार के रूप में या उबंटू में कक्षाओं के रूप में चलाने की कोशिश कर रहा हूं। मैं दोनों विकल्पों में विफल रहा। निम्न अपवाद इसका आउटपुट है।

Download link: https://upload.cat/f694139f88c663b1

java org.statmetrics.Statmetric

या

java -cp /home/elias/statmetrics/statmetrics.jar:। org.statmetrics.Statmetrics

या

java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmeics-statmetrics.jar org.statmetrics.Statmetrics

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/adapters/XmlAdapter
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.statmetrics.c.a(Unknown Source)
    at org.statmetrics.dw.a(Unknown Source)
    at org.statmetrics.dx.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.adapters.XmlAdapter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 12 more

मुझे जवाब मिला:

मेरी मूर्खता।

पहला कदम: आपको संबंधित जावा सेट करना होगा: मेरे पास जावा ११ था लेकिन मैंने the वें संस्करण के लिए जावा कामगार पथ के रूप में सेट किया था! - आप यहाँ से जावा संस्करण सेट कर सकते हैं:

  sudo update-alternatives --config java

दूसरा चरण: फिर निम्नलिखित कमांड चलाएं, पथ को बदलकर और अपने संबंधित पथ और फ़ाइलों के नाम दर्ज करें:

  java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmetrics/statmetrics.jar org.statmetrics.Statmetrics

यह सफलतापूर्वक चला गया था!

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