का कारण बन रहा है क्योंकि मैं पूरी तरह से सुनिश्चित नहीं कर रहा हूं कि मैंने सही काम किया है। मैं एक वेब प्रोजेक्ट के लिए ग्रहण का उपयोग कर रहा हूं। चलो इसे 0Pपैकेज में WebProject (duh) कहते हैं।ServiceLoader.next कोई NoClassDefFoundError
मैं वेबप्रोजेक्ट को रनटाइम पर जेएआर प्लगइन्स लोड करना चाहता हूं, इसलिए मैंने सोचा कि मैं java.util.ServiceLoader
का लाभ उठा सकता हूं। तो मैंने वेबप्रोजेक्ट प्रोजेक्ट में प्लगइन को लागू करने के सभी तरीकों के साथ इंटरफेस com.web.project.WebProjectPlugin
बनाया।
तब मैं परियोजना PluginProject, एक वर्ग फ़ोल्डर के रूप में अपने रास्ते बिल्ड में WebProbject/निर्माण/वर्गों को जोड़ने के लिए बनाया:
package com.web.project.plugin;
import com.web.project.WebProjectPlugin;
public class TestPlugin implements WebProjectPlugin {
// Implementation of the interface methods...
}
तब मैं प्लगइन परियोजना में एक META-INF/सेवाओं फ़ोल्डर बनाया, डाल पाठ फ़ाइल com.web.project.WebProjectPlugin
अंदर, जिसमें एकमात्र पंक्ति "com.web.project.plugin.TestPlugin" शामिल है।
मैंने जेएआर फ़ाइल को अतिरिक्त बिल्ड/क्लास फ़ोल्डर की जांच करके निर्यात किया और इसे कहीं हार्ड ड्राइव में रखा। जब WebProject शुरू होता है, तो निम्न बातें करता है:।
File[] jlist = pluginsDir.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.getPath().toLowerCase().endsWith(".jar");
}
});
URL[] urls = new URL[jlist.length];
for (int i = 0; i < jlist.length; i++)
urls[i] = jlist[i].toURI().toURL();
URLClassLoader ucl = new URLClassLoader(urls);
ServiceLoader<WebProjectPlugin> srvl =
ServiceLoader.load(WebProjectPlugin.class, ucl);
Iterator<WebProjectPlugin> iter = srvl.iterator();
while (iter.hasNext()) {
WebProjectPlugin plugin = iter.next();
plugins.add(plugin);
}
pluginsDir
निर्देशिका JAR फ़ाइल में है को इंगित करने वाले File
वस्तु है पहले यह, कि srvl
अपने काम करता है लगता है के बाद से iter
खाली नहीं है, लेकिन तो यह ड्रेस्ड फेंकता है जब यह iter.next()
तक पहुंचता है।
मैं पहले से ही ServiceLoader
का परीक्षण करने के लिए एक प्लगइन प्रबंधक प्रोजेक्ट बनाने में कामयाब रहा हूं, और यह ठीक है, लेकिन यह एक सादा कंसोल जावा एप्लिकेशन है, न कि वेब प्रोजेक्ट। तो, मैं यहाँ क्या गलत कर रहा हूँ?
मैं थोड़ा परेशान हूं: com.web.project.WebProjectPlugin
के लिए कक्षा परिभाषा को कैसे ढूंढ सकता है, क्योंकि यह उसी प्रोजेक्ट में चल रहा है? क्या URLClassLoader
ऑब्जेक्ट के साथ ऐसा कुछ है जो मैं उपयोग कर रहा हूं?
यह stack trace है।
मुझे लगता है कि आपका मतलब था 'थ्रेड.currentThread()। GetContextClassLoader() ', लेकिन आप जानते हैं क्या? यह ठीक है! धन्यवाद! – MaxArt
हाँ, मेरा मतलब है कि। मैंने जवाब अपडेट किया है। धन्यवाद! – NilsH