You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "scott (JIRA)" <ji...@apache.org> on 2007/08/29 04:07:31 UTC
[jira] Created: (AXIS2-3157) Loader.java in util package of kernel
can not find the class in extremely environment
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 {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
* <li>From {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
* <li>From the {@link 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 {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
* <li>Using the basic {@link Class#forName(java.lang.String) }
* <li>From {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
* <li>From the {@link 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: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org
[jira] Commented: (AXIS2-3157) Loader.java in util package of
kernel can not find the class in extremely environment
Posted by "Davanum Srinivas (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/AXIS2-3157?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12578112#action_12578112 ]
Davanum Srinivas commented on AXIS2-3157:
-----------------------------------------
Please review latest SVN or even Axis2 1.3 and submit a patch against latest code.
thanks,
dims
> 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 {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
> * <li>From {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
> * <li>From the {@link 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 {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
> * <li>Using the basic {@link Class#forName(java.lang.String) }
> * <li>From {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
> * <li>From the {@link 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: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org
[jira] Resolved: (AXIS2-3157) Loader.java in util package of kernel
can not find the class in extremely environment
Posted by "Davanum Srinivas (JIRA)" <ji...@apache.org>.
[ 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 {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
> * <li>From {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
> * <li>From the {@link 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 {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
> * <li>Using the basic {@link Class#forName(java.lang.String) }
> * <li>From {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
> * <li>From the {@link 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: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org