2016-08-29 14 views
18

एक को कॉपी एक जावा कोड के रूप में की है।बूटस्ट्रैप वर्ग रास्ते में एक जार फ़ाइल काम नहीं कर रहा

$jar -cvf hello.jar Hello.class 

मैं के रूप में एक और कार्यक्रम लिखा है::

class Test1 
{ 
     public static void main(String[] args) 
     { 
       new Hello().print(); 
       System.out.println(Hello.class.getClassLoader()); 
     } 
} 

और वर्तमान निर्देशिका से Hello.class नष्ट कर दिया मैं के रूप में एक जार फ़ाइल hello.jar में जोड़ा।

तब मैंने एक्सटेंशन क्लास पथ में hello.jar की प्रतिलिपि बनाई। मेरे कार्यक्रम काम करता है ठीक है:

$sudo cp hello.jar /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext 
$ java Test1 
Hi 
[email protected] 
$ 

अगर मैं विस्तार वर्ग पथ से hello.jar हटा सकते हैं और बूट पट्टा वर्ग पथ (usr/lib/JVM/जावा-8-openjdk-amd64/JRE/lib में इसे कॉपी /) जिसमें rt.jar भी है, तो मेरा प्रोग्राम काम नहीं कर रहा है।

$ java Test1 
Exception in thread "main" java.lang.NoClassDefFoundError: Hello 
    at Test1.main(Test1.java:5) 
Caused by: java.lang.ClassNotFoundException: Hello 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 1 more 

मेरे ज्ञान के अनुसार बूटस्ट्रैप या एक्सटेंशन क्लास लोडर में सभी जार फ़ाइलों को प्रोग्राम में उपयोग किया जा सकता है। जावा ने उस अपवाद को क्यों फेंक दिया है यदि यह सही है? अगर मैं सही नहीं हूं तो कृपया मुझे मार्गदर्शन करें।

उत्तर

4

कैसे जावा लांचर बूटस्ट्रैप वर्ग

बूटस्ट्रैप कक्षाएं ढूँढता वर्गों है कि जावा 2 मंच को लागू कर रहे हैं। बूटस्ट्रैप कक्षाएं jt/lib निर्देशिका में rt.jar और कई अन्य जार फ़ाइलों में हैं। इन अभिलेखागार को बूटस्ट्रैप क्लास पथ के मान द्वारा निर्दिष्ट किया गया है जो sun.boot.class.path सिस्टम प्रॉपर्टी में संग्रहीत है। यह सिस्टम प्रॉपर्टी केवल संदर्भ के लिए है, और इसे सीधे संशोधित नहीं किया जाना चाहिए।

यह बहुत ही असंभव है कि आपको बूटस्ट्रैप क्लास पथ को फिर से परिभाषित करने की आवश्यकता होगी। गैर मानक विकल्प, -Xbootclasspath, आपको उन दुर्लभ परिस्थितियों में ऐसा करने की अनुमति देता है जिसमें कोर कक्षाओं के एक अलग सेट का उपयोग करना आवश्यक है।

ऊपर दिए गए बयान आपको आपके प्रश्न के उत्तर प्रदान करेंगे।

[Check Oracle Doc]

System.out.println(System.getProperty("sun.boot.class.path")); 

C:\Program Files\Java\jdk1.8.0_74\jre\lib\resources.jar; 
C:\Program Files\Java\jdk1.8.0_74\jre\lib\rt.jar; 
C:\Program Files\Java\jdk1.8.0_74\jre\lib\sunrsasign.jar; 
C:\Program Files\Java\jdk1.8.0_74\jre\lib\jsse.jar; 
C:\Program Files\Java\jdk1.8.0_74\jre\lib\jce.jar; 
C:\Program Files\Java\jdk1.8.0_74\jre\lib\charsets.jar; 
C:\Program Files\Java\jdk1.8.0_74\jre\lib\jfr.jar; 
C:\Program Files\Java\jdk1.8.0_74\jre\classes 
4

मैं जावा 7 नहीं 8 उपयोग कर रहा हूँ, मैं उम्मीद है कि इस जावा के सभी संस्करणों के लिए ठीक है।

जावा 7 में

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

6

बूटस्ट्रैप कक्षाओं में डिफ़ॉल्ट रूप से अलग होते हैं, वे केवल, rt.jar की कक्षाओं और कई अन्य महत्वपूर्ण जार फ़ाइलों में शामिल हैं के रूप में यह है सुरक्षित और केवल विस्तारित करने के लिए नहीं है विस्तार कक्षा को जार फ़ाइलों को jre/lib/ext/ में जोड़कर विस्तारित किया जाना है।

आप अगले के रूप में अपने JVM शुरू करके classpath ओपन JDK पर बूटस्ट्रैप कक्षाएं को परिभाषित संशोधित कर सकते हैं हालांकि:

java -Xbootclasspath/a:"/path/to/my/folder/classes" Test1 

-Xbootclasspath/एक: पथ

एक कॉलन निर्दिष्ट करें - डिफ़ॉल्ट बूटस्ट्रैप कक्षा पथ में जोड़ने के लिए निर्देशकों का अलग पथ, जेएआर अभिलेखागार, और ज़िप अभिलेखागार।

-Xbootclasspath/p: पथ

directires, जार अभिलेखागार के एक कॉलन से अलग किए पथ निर्दिष्ट करें, और डिफ़ॉल्ट बूटस्ट्रैप वर्ग पथ के सामने पहले जोड़ें करने के लिए अभिलेखागार ज़िप। नोट: rt.jar में किसी वर्ग को ओवरराइड करने के उद्देश्य से इस विकल्प का उपयोग करने वाले अनुप्रयोगों को पर तैनात नहीं किया जाना चाहिए क्योंकि ऐसा करने के लिए जावा 2 रनटाइम एनवायरनमेंट बाइनरी कोड लाइसेंस का उल्लंघन होगा।

यहाँ एक ठोस उदाहरण https://wiki.openjdk.java.net/display/mlvm/BootClassPath

है
संबंधित मुद्दे