[
https://issues.apache.org/jira/browse/AXIS2-3157?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Davanum Srinivas resolved AXIS2-3157.
-------------------------------------
Resolution: Fixed
> Loader.java in util package of kernel can not find the class in extremely
> environment
> -------------------------------------------------------------------------------------
>
> Key: AXIS2-3157
> URL: https://issues.apache.org/jira/browse/AXIS2-3157
> Project: Axis 2.0 (Axis2)
> Issue Type: Bug
> Components: kernel
> Affects Versions: 1.1.1
> Environment: Develop a client of axis2 webservice as a component in a
> specific software platform.
> Reporter: scott
>
> When I develop a client of web service, I get a error as belowing:
> at
> org.apache.axis2.engine.AxisConfiguration.engageModule(AxisConfiguration.java:356)
> at org.apache.axis2.deployment.DeploymentEngine.engageModules
> (DeploymentEngine.java:664)
> at
> org.apache.axis2.deployment.FileSystemConfigurator.engageGlobalModules(FileSystemConfigurator.java:124)
> at
> org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContext(ConfigurationContextFactory.java:71)
> at
> org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContextFromFileSystem(ConfigurationContextFactory.java:180)
> I track the code and find the reason is the class is not loaded successfully,
> and I found that the Loader.java class is not powerful to deal with some
> extremely environment, so I change the approach of load class and it works.
> The original code is belowing:
> org.apache.axis2.util.Loader.java
> /**
> * Loads the specified classloader and then falls back to the loadClass.
> *
> * @param loader
> * @param clazz
> * @return Returns Class.
> * @throws ClassNotFoundException
> */
> static public Class loadClass(ClassLoader loader, String clazz) throws
> ClassNotFoundException {
> try {
> if(loader != null) {
> Class c = loader.loadClass(clazz);
> if (c != null)
> return c;
> }
> } catch (Throwable e) {
> log.debug(e);
> }
> return loadClass(clazz);
> }
> /**
> * If running under JDK 1.2, loads the specified class using the
> * <code>Thread</code> <code>contextClassLoader</code> . If that
> * fails, try Class.forname.
> * <p/>
> *
> * @param clazz
> * @return Returns Class.
> * @throws ClassNotFoundException
> */
> static public Class loadClass(String clazz) throws ClassNotFoundException
> {
> try {
> ClassLoader tcl = getTCL();
>
> if(tcl != null) {
> Class c = tcl.loadClass(clazz);
> if (c != null)
> return c;
> }
> } catch (Throwable e) {
> log.debug(e);
> }
> // we reached here because tcl was null or because of a
> // security exception, or because clazz could not be loaded...
> // In any case we now try one more time
> return Class.forName(clazz);
> }
> After change:
> static public Class loadClass(ClassLoader loader, String clazz) throws
> ClassNotFoundException {
> try {
> Class c = ClassLoaderUtils.loadClass(clazz,
> org.apache.axis2.AxisFault.class);
> if (c != null)
> return c;
> } catch (Throwable e) {
> log.warn(e);
> throw new ClassNotFoundException();
> }
> return loadClass(clazz);
> }
> static public Class loadClass(String clazz) throws ClassNotFoundException {
> try {
> Class c = ClassLoaderUtils.loadClass(clazz,
> org.apache.axis2.AxisFault.class);
> if (c != null)
> return c;
> } catch (Throwable e) {
> log.warn(e);
> throw new ClassNotFoundException();
> }
> // we reached here because tcl was null or because of a
> // security exception, or because clazz could not be loaded...
> // In any case we now try one more time
> return Class.forName(clazz);
> }
> public class ClassLoaderUtils {
> /**
> * Load a given resource.
> * <p/>
> * This method will try to load the resource using the following methods
> (in order):
> * <ul>
> * <li>From [EMAIL PROTECTED] Thread#getContextClassLoader()
> Thread.currentThread().getContextClassLoader()}
> * <li>From [EMAIL PROTECTED] Class#getClassLoader()
> ClassLoaderUtil.class.getClassLoader()}
> * <li>From the [EMAIL PROTECTED] Class#getClassLoader()
> callingClass.getClassLoader() }
> * </ul>
> *
> * @param resourceName The name of the resource to load
> * @param callingClass The Class object of the calling object
> */
> public static URL getResource(String resourceName, Class callingClass) {
> URL url = null;
> url =
> Thread.currentThread().getContextClassLoader().getResource(resourceName);
> if (url == null) {
> url =
> ClassLoaderUtils.class.getClassLoader().getResource(resourceName);
> }
> if (url == null) {
> url = callingClass.getClassLoader().getResource(resourceName);
> }
> return url;
> }
> /**
> * This is a convenience method to load a resource as a stream.
> * <p/>
> * The algorithm used to find the resource is given in getResource()
> *
> * @param resourceName The name of the resource to load
> * @param callingClass The Class object of the calling object
> */
> public static InputStream getResourceAsStream(String resourceName, Class
> callingClass) {
> URL url = getResource(resourceName, callingClass);
> try {
> return (url != null) ? url.openStream() : null;
> } catch (IOException e) {
> return null;
> }
> }
> /**
> * Load a class with a given name.
> * <p/>
> * It will try to load the class in the following order:
> * <ul>
> * <li>From [EMAIL PROTECTED] Thread#getContextClassLoader()
> Thread.currentThread().getContextClassLoader()}
> * <li>Using the basic [EMAIL PROTECTED] Class#forName(java.lang.String) }
> * <li>From [EMAIL PROTECTED] Class#getClassLoader()
> ClassLoaderUtil.class.getClassLoader()}
> * <li>From the [EMAIL PROTECTED] Class#getClassLoader()
> callingClass.getClassLoader() }
> * </ul>
> *
> * @param className The name of the class to load
> * @param callingClass The Class object of the calling object
> * @throws ClassNotFoundException If the class cannot be found anywhere.
> */
> public static Class loadClass(String className, Class callingClass)
> throws ClassNotFoundException {
> try {
> return
> Thread.currentThread().getContextClassLoader().loadClass(className);
> } catch (ClassNotFoundException e) {
> try {
> return Class.forName(className);
> } catch (ClassNotFoundException ex) {
> try {
> return
> ClassLoaderUtils.class.getClassLoader().loadClass(className);
> } catch (ClassNotFoundException exc) {
> return callingClass.getClassLoader().loadClass(className);
> }
> }
> }
> }
> /**
> * Prints the current classloader hierarchy - useful for debugging.
> */
> public static void printClassLoader() {
> System.out.println("ClassLoaderUtils.printClassLoader");
> printClassLoader(Thread.currentThread().getContextClassLoader());
> }
> /**
> * Prints the classloader hierarchy from a given classloader - useful for
> debugging.
> */
> public static void printClassLoader(ClassLoader cl) {
> System.out.println("ClassLoaderUtils.printClassLoader(cl = " + cl +
> ")");
> if (cl != null) {
> printClassLoader(cl.getParent());
> }
> }
> }
> Additionally, I have found that if the target class not be loaded
> successfully, there is no way to throw ClassNotFoundException, I think it's
> not proper and it will give the developer wrong message of Exception.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]