2013-09-25 7 views
8

हमारे पास एक निष्पादन योग्य JAR फ़ाइल है जो कभी-कभी में अन्य JAR फ़ाइलें शामिल हैं।जावा के क्लासलोडर बनाम जार-इन-जार

// wearyingly verbose error handling elided 

URL nestedURL = the_main_system_classloader.getResource("path/to/nested.jar"); 
File temp = File.createTempFile (....); 
// copy out nestedURL contents into temp, byte for byte 

URL tempURL = temp.toURI().toURL(); 
URLClassLoader loader = URLClassLoader.newInstance(new URL[]{ tempURL }); 
Class<?> clazz = loader.loadClass("com.example.foo.bar.baz.Thing"); 
Thing thing = (Thing) clazz.newInstance(); 
// do stuff with thing 

इस तकनीक की तरह हैं: (। पूरी बात चार अन्य डाउनलोड जार पर टिकी हुई है, अंतरिक्ष में एक विशाल तैनात कछुए की पीठ पर सवारी) क्रम में, हम गतिशील निम्न कार्य है कि नेस्टेड JAR फ़ाइल लोड पहले यहां लाया गया था; लिंक में this one और this one शामिल हैं। वर्तमान में हमारे पास मौजूद कोड है ...

... अधिकतर। मैं वास्तव में अस्थायी फ़ाइल निर्माण और प्रतिलिपि (और अंतिम सफाई) से बचने का कोई तरीका ढूंढना चाहता हूं, क्योंकि हम सभी जानते हैं, deleteOnExit is evil)। यूआरएल एक जार करने के लिए शुरू बिंदुओं पर सही प्राप्त, सब के बाद:

URL nestedURL = the_main_system_classloader.getResource("path/to/nested.jar"); 
// nestedURL.toString() at this point is 
// "jar:file:/C:/full/path/to/the/executable.jar!/path/to/nested.jar" 
URLClassLoader loader = URLClassLoader.newInstance(new URL[]{ nestedURL }); 
Class<?> clazz = loader.loadClass("com.example.foo.bar.baz.Thing"); 

लेकिन loadClass एक ClassNotFound फेंकता है।

क्या URLClassLoader बस इस JAR-in-a-JAR मामले को संभाल नहीं सकता है? या क्या मुझे यह काम करने के लिए शामिल पथों में से एक या अधिक कुछ करने की आवश्यकता है (या तो nestedURL या loadClass को पारित स्ट्रिंग)?

+0

मैं शायद इसे एक एकल जार बनाने के लिए उपयोग करूंगा - http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html। –

+0

क्या आपने अपने मुख्य श्रेणी लोडर में 'addUrl' करने का प्रयास किया है, फिर कक्षा को सामान्य रूप से लोड करें? – assylias

+0

@PaulGrime दुर्भाग्य से, लाइसेंसिंग हमें केवल नेस्टेड जार फ़ाइलों को फिर से वितरित करने की अनुमति देता है, लेकिन उन्हें अनपैक/रीपैक नहीं करता है। –

उत्तर

0

AFAIK वेनिला URLClassloader इसे संभाल नहीं सकता है।

अभी तक यह आपका उत्तर है।

अलावा अपने समाधान से दो अन्य संभावनाओं है कि मैं के बारे में पता कर रहा हूँ देखते हैं:

  1. एक वसा जार (p.ex. Maven शेड का प्रयोग करके)
  2. एक कस्टम classloader बनाएँ, लेकिन इस प्रकार है कड़ी मेहनत
संबंधित मुद्दे