2012-01-03 12 views
11

कैसे मैं जेबॉस 7 का उपयोग कर रहा हूं (निर्भरता लोडिंग इस संस्करण में बदल दी गई थी)। मेरा युद्ध-एप्लिकेशन सर्वर जार में अपलोड करता है और उनमें से कक्षाओं का उपयोग करने की आवश्यकता होती है, लेकिन यह ClassNotFoundException हो जाती है। इसलिए मुझे गतिशील रूप से मॉड्यूल में जार-निर्भरता जोड़ने का कोई तरीका नहीं मिल रहा है - MANIFEST.MF, jboss-deployment-structure.xml ऐसा करने का स्थिर तरीका है।जेबॉस 7: गतिशील रूप से जार

+1

आप उल्लेख करते हैं कि जेबॉस 7 के लिए निर्भरता लोडिंग बदल दी गई है। क्या आपने जेबॉस के पुराने संस्करणों का उपयोग करके ऐसा किया है? क्या आप अपने पिछले दृष्टिकोण का वर्णन कर सकते हैं? – GargantuChet

+0

मुझे लगता है कि [यह दस्तावेज़ीकरण] (https://community.jboss.org/wiki/ModuleCompatibleClassloadingGuide) उपयोगी हो सकता है – higuaro

उत्तर

5

बस यह सुनिश्चित करने के लिए प्रश्न को दोहराएं कि यह सही है;

आप सर्वर पर एक मनमानी जार फ़ाइल अपलोड करने में सक्षम होना चाहते हैं और फिर JVM में निहित कक्षाओं/संसाधनों का उपयोग करना चाहते हैं? JVM को पुनरारंभ किए बिना और/या आपके कॉन्फ़िगरेशन को संपादित करने के बिना।

यदि ऐसा है, तो आपको जार को एक क्लासलोडर में लोड करना चाहिए (यदि आवश्यक हो तो अपने वर्तमान क्लासलोडर को चेन करना) और उसके बाद कक्षा को लोड करना चाहिए।

public static Class<?> loadClass(String className, String jarFileLocation) 
     throws MalformedURLException, ClassNotFoundException { 
    URL jarUrl = new File(jarFileLocation).toURI().toURL(); 
    ClassLoader classLoader = new URLClassLoader(new URL[] {jarUrl }, MyClass.class.getClassLoader()); 
    return classLoader.loadClass(className); 
} 

public static Object executeMethodOndClass(String methodName, Class<?>[] parameterTypes, 
               Object[] parameters, String className, String jarFileLocation) 
     throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException, 
     NoSuchMethodException, InvocationTargetException { 
    Class<?> loadedClass = loadClass(className, jarFileLocation); 
    Method method = loadedClass.getMethod(methodName, parameterTypes); 
    Object instance = loadedClass.newInstance(); 
    return method.invoke(instance, parameters); 
} 

पी.एस.:

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

पीपीएस। कस्टम जार फ़ाइलों को अपलोड करने की अनुमति देता है और इसे से निष्पादित करने के लिए कक्षाएं इसके साथ कई (सुरक्षा) जोखिम लाती हैं।

+0

मुझे यह उत्तर पसंद है, लेकिन सवाल नहीं है- प्रश्न को संबोधित करें। अंततः jboss में manfiest/jboss-deployment-structure.xml के माध्यम से निर्भरता सेट करने के बीच अंतर यह है कि यह स्पष्ट रूप से उन सभी वर्गों को आपके एप्लिकेशन क्लासलोडर में उपलब्ध कराता है, बिना उन्हें स्पष्ट रूप से नाम देने या उन्हें अलग से वर्गीकृत करने की आवश्यकता के बिना। इसका यह सुनिश्चित करने का लाभ है कि आपके द्वारा नियंत्रित किए जाने वाले किसी भी ब्लैकबॉक्स सिस्टम (जेएसपी हैंडलर को प्रेषित करने आदि) के पास उन वर्गों तक पहुंच होगी (यदि वे तैनाती के उसी एप्लिकेशन क्लासलोडर के साथ शुरू हो गए हैं)। – Rhys

0

@Rage: This question स्टैक ओवरफ्लो पर पहले पूछा गया था कि आपको जार व्यवस्थित करने के लिए कुछ इनपुट दे सकते हैं: चाहे वह स्वयं या तृतीय-पक्ष जार हो। इस विधि के साथ एक साथ

import java.io.File; 
import java.io.IOException; 
import java.lang.reflect.Method; 
import java.net.URL; 
import java.net.URLClassLoader; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 


public final class ClassPathHacker { 
    private static final Class<?>[] PARAMS = new Class<?>[] { URL.class }; 
    private static final Logger LOG_CPH = LoggerFactory.getLogger(ClassPathHacker.class); 

    private ClassPathHacker() {} 

    public static void addFile(final String pFileName) throws IOException { 
     final File myFile = new File(pFileName); 

     ClassPathHacker.addFile(myFile); 
    } 

    public static void addFile(final File pFile) throws IOException { 
     ClassPathHacker.addURL(pFile.toURI().toURL()); 
    } 

    public static void addURL(final URL pFileUrl) throws IOException { 

     /* variables definition */ 
     final URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
     final Class<?> sysClass = URLClassLoader.class; 

     try { 
      final Method myMethod = sysClass.getDeclaredMethod("addURL", PARAMS); 

      myMethod.setAccessible(true); 
      myMethod.invoke(sysLoader, new Object[] { pFileUrl }); 
     } catch (final Exception exc) { 
      ClassPathHacker.LOG_CPH.error(exc.getLocalizedMessage(), exc); 

      throw new IOException(exc.getLocalizedMessage()); 
     } 
    } 
} 

:

0

इस (मैं इसे कहीं इंटरनेट पर पकड़ लिया गया है) की कोशिश करो

MainApplication.hackClassPath(new File("test/data")); 
    MainApplication.hackClassPath(new File("data")); 

:

private static void hackClassPath(final File myData) { 
    if (myData.isDirectory()) { 

     /* block variables */ 
     final File[] myList = myData.listFiles(); 

     /* hacking classpath... */ 
     for (final File tmp : myList) { 
      try { 
       ClassPathHacker.addFile(tmp.getAbsolutePath()); 
       MainApplication.MAIN_LOG.trace("{} added to classpath", 
               tmp.getAbsolutePath()); 
      } catch (final IOException iOE) { 
       MainApplication.MAIN_LOG.error(iOE.getLocalizedMessage(), 
               iOE); 
      } 
     } 
    } 
} 

और यह नमूना कॉल के साथ थोड़ा हैकी, लेकिन शायद यह काम करता है ... यह रनटाइम डेटा या परीक्षण/डेटा निर्देशिका में उपलब्ध सभी जेएआर फाइलों को चल रहा है asspath।

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