2013-04-30 10 views
6

का कारण बन रहा है क्योंकि मैं पूरी तरह से सुनिश्चित नहीं कर रहा हूं कि मैंने सही काम किया है। मैं एक वेब प्रोजेक्ट के लिए ग्रहण का उपयोग कर रहा हूं। चलो इसे 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 है।

उत्तर

5

उम्मीद अपने URLClassLoader

URLClassLoader loader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader()); 

एक WebProject को माता-पिता classloader बताए वर्ग लोडर की एक निश्चित पदानुक्रम का प्रयास करें, तो यह हो सकता है कि अपनी कक्षाओं को एक दूसरे से दिखाई नहीं देते हैं, तो माता पिता/बच्चे hieararchy नहीं है ठीक से सेट करें।

+0

मुझे लगता है कि आपका मतलब था 'थ्रेड.currentThread()। GetContextClassLoader() ', लेकिन आप जानते हैं क्या? यह ठीक है! धन्यवाद! – MaxArt

+0

हाँ, मेरा मतलब है कि। मैंने जवाब अपडेट किया है। धन्यवाद! – NilsH

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