[ http://issues.apache.org/jira/browse/DISCOVERY-1?page=all ]
Henri Yandell resolved DISCOVERY-1. ----------------------------------- Resolution: Fixed Tentatively resolving this as fixed in 0.4 based on Dims' belief [Dims is an Axis coder]. If still a problem, please give either the nightly build a shot, or 0.4 when it gets released: http://people.apache.org/builds/jakarta-commons/nightly/commons-discovery/ > [discovery] ClassLoader Problem with AXIS in Servlet Container WebSphere > ------------------------------------------------------------------------ > > Key: DISCOVERY-1 > URL: http://issues.apache.org/jira/browse/DISCOVERY-1 > Project: Commons Discovery > Issue Type: Bug > Environment: Operating System: Windows XP > Platform: PC > Reporter: Torge Harbig > Fix For: 0.4 > > > please excuse bad englisch > Szenario: (ClassLoader) > WebSphere > OurServlet > AXIS > We redirect AXIS Logging (org.apache.commons.logging.LogFactory) to our own > logFactory so that we can output messages of AXIS in our own logFiles. > And we need to prepare service calls for AXIS so all access to AXIS is > indirected over our own Servlet (OurServlet) which loads AXIS using > Class.forName().newInstance() > In WebSphere we get an Exception that AXIS can not load our Logger (AXIS uses > Commons Discovery) > The Problem: > a) WebSphere itself uses Commons Discovery and loads Commons Discovery in the > ?WebContainer?-ClassLoader. OurServlet and AXIS are loaded in a > ?Servlet?-ClassLoader ... > b) Initializing AXIS / AXIS calls DiscoverSingleton.find() which searches for > the configured logger / but can not find it in the ?WebContainer?-ClassLoader. > It follows a short java file for testing/demonstrating the problem. > Additionally > needed for Test is a Logger Implementation in a single jar File myLogger.jar > (look at the following source) > In the code the exception from commons Discovery is given and a solution we > use > to solve this problem (but perhaps it is not the recommended way) / > Can someone who understands the problem tell me how it should bo solved? > Thanks. > import java.net.URL; > import java.net.URLClassLoader; > import org.apache.commons.discovery.resource.ClassLoaders; > import org.apache.commons.discovery.tools.DefaultClassHolder; > import org.apache.commons.discovery.tools.DiscoverSingleton; > import org.apache.commons.discovery.tools.SPInterface; > public class ClassLoaderTest > { > public static void main( String args[] )throws Exception > { ClassLoaderTest clt = new ClassLoaderTest(); > clt.problem2(); > } > static String libPath = "file:// **path** "; // set correct path here !! > > public void problem1()throws Exception > { URL url1[] = new URL[] > { new URL( libPath+"commons-discovery.jar"), > new URL( libPath+"commons-logging.jar"), > new URL( libPath+"servlet.jar") > }; > ClassLoader parentClassLoader > = new URLClassLoader( url1, getClass().getClassLoader() ); > > URL url2[] = new URL[] > { new URL( libPath+"axis.jar"), > new URL( libPath+"axis-ant.jar"), > new URL( libPath+"commons-logging.jar"), > new URL( libPath+"commons-discovery.jar"), > new URL( libPath+"log4j-1.2.8.jar"), > new URL( libPath+"wsdl4j.jar"), > new URL( libPath+"jaxrpc.jar"), > new URL( libPath+"xerces.jar"), > new URL( libPath+"saaj.jar"), > new URL( libPath+"mylog.jar") // jar with my logger class ... > }; > > ClassLoader childClassLoader = new URLClassLoader( url2, > parentClassLoader ); > System.setProperty > ( "org.apache.commons.logging.LogFactory" > , "mylog.MyLogger" > ); > Class axisServletClass = childClassLoader.loadClass( > "org.apache.axis.transport.http.AxisServlet" ); > Object axisServlet = axisServletClass.newInstance(); > > /* > * Problem: discovery can not load class mylog.MyLogger in mylog.jar > because > * it is in another class loader ... > * > * AXIS uses DiscoverSingleton.find Method ... > */ > /* > java.lang.ExceptionInInitializerError > at > org.apache.axis.transport.http.AxisServletBase.<clinit>(AxisServletBase.java:94) > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) > at > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) > at > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) > at java.lang.reflect.Constructor.newInstance(Constructor.java:274) > at java.lang.Class.newInstance0(Class.java:308) > at java.lang.Class.newInstance(Class.java:261) > at ClassLoaderTest.problem(ClassLoaderTest.java:49) > at ClassLoaderTest.main(ClassLoaderTest.java:13) > Caused by: org.apache.commons.discovery.DiscoveryException: No > implementation defined for org.apache.commons.logging.LogFactory > at > org.apache.commons.discovery.tools.DiscoverClass.find(DiscoverClass.java:407) > at > org.apache.commons.discovery.tools.DiscoverClass.newInstance(DiscoverClass.java:582) > at > org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:418) > at > org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:378) > at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:84) > at java.security.AccessController.doPrivileged(Native Method) > at > org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:80) > at > org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:72) > ... 9 more > */ > } > > public void problem2()throws Exception > { URL url1[] = new URL[] > { new URL( libPath+"commons-discovery.jar"), > new URL( libPath+"commons-logging.jar"), > new URL( libPath+"servlet.jar") > }; > ClassLoader parentClassLoader > = new URLClassLoader( url1, getClass().getClassLoader() ); > > URL url2[] = new URL[] > { new URL( libPath+"axis.jar"), > new URL( libPath+"axis-ant.jar"), > new URL( libPath+"commons-logging.jar"), > new URL( libPath+"commons-discovery.jar"), > new URL( libPath+"log4j-1.2.8.jar"), > new URL( libPath+"wsdl4j.jar"), > new URL( libPath+"jaxrpc.jar"), > new URL( libPath+"xerces.jar"), > new URL( libPath+"saaj.jar"), > new URL( libPath+"mylog.jar") // jar with my logger class ... > }; > > ClassLoader childClassLoader = new URLClassLoader( url2, > parentClassLoader ); > System.setProperty > ( "org.apache.commons.logging.LogFactory" > , "mylog.MyLogger" > ); > > Thread.currentThread().setContextClassLoader( childClassLoader ); > Class axisServletClass = childClassLoader.loadClass( > "org.apache.axis.transport.http.AxisServlet" ); > Object axisServlet = axisServletClass.newInstance(); > > /* > * Problem: discovery can not load class mylog.MyLogger in mylog.jar > because > * it is in another class loader ... > * > * AXIS uses DiscoverSingleton.find Method ... > */ > /* > java.lang.ExceptionInInitializerError > at > org.apache.axis.transport.http.AxisServletBase.<clinit>(AxisServletBase.java:94) > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) > at > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) > at > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) > at java.lang.reflect.Constructor.newInstance(Constructor.java:274) > at java.lang.Class.newInstance0(Class.java:308) > at java.lang.Class.newInstance(Class.java:261) > at ClassLoaderTest.problem(ClassLoaderTest.java:49) > at ClassLoaderTest.main(ClassLoaderTest.java:13) > Caused by: org.apache.commons.discovery.DiscoveryException: No > implementation defined for org.apache.commons.logging.LogFactory > at > org.apache.commons.discovery.tools.DiscoverClass.find(DiscoverClass.java:407) > at > org.apache.commons.discovery.tools.DiscoverClass.newInstance(DiscoverClass.java:582) > at > org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:418) > at > org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:378) > at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:84) > at java.security.AccessController.doPrivileged(Native Method) > at > org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:80) > at > org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:72) > ... 9 more > */ > } > public void solution()throws Exception > { URL url1[] = new URL[] > { new URL( libPath+"commons-discovery.jar"), > new URL( libPath+"commons-logging.jar"), > new URL( libPath+"servlet.jar") > }; > ClassLoader parentClassLoader > = new URLClassLoader( url1, getClass().getClassLoader() ); > > URL url2[] = new URL[] > { new URL( libPath+"axis.jar"), > new URL( libPath+"axis-ant.jar"), > new URL( libPath+"commons-logging.jar"), > new URL( libPath+"commons-discovery.jar"), > new URL( libPath+"log4j-1.2.8.jar"), > new URL( libPath+"wsdl4j.jar"), > new URL( libPath+"jaxrpc.jar"), > new URL( libPath+"xerces.jar"), > new URL( libPath+"saaj.jar"), > new URL( libPath+"mylog.jar") // jar with my logger class ... > }; > > ClassLoader childClassLoader = new URLClassLoader( url2, > parentClassLoader ); > // Solution - preLoading Singleton ... > Thread.currentThread().setContextClassLoader( childClassLoader ); > Class myLog = childClassLoader.loadClass( "mylog.MyLogger" ); > DefaultClassHolder defaultClassHolder = new DefaultClassHolder( myLog ); > > Class loggerInterface = childClassLoader.loadClass( > "org.apache.commons.logging.LogFactory" ); > > ClassLoaders classLoaders = new ClassLoaders(); > classLoaders.put( childClassLoader ); > Object o = DiscoverSingleton.find > ( classLoaders, new SPInterface(loggerInterface), null, > defaultClassHolder > ); > > // AXIS now loads the correct logger singleton ... > Class axisServletClass = childClassLoader.loadClass( > "org.apache.axis.transport.http.AxisServlet" ); > Object axisServlet = axisServletClass.newInstance(); > } > } -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]