jakarta-eegeronimocontextclassloader

Custom Annotation Scanning Under Geronimo with Tomcat container


How do we get access to the jars that are in “shared/lib” directory of Geronimo Server ?
I am using following code to walk through the class loader hierarchy, but unable to get jars libraries found in “shared/lib’” folder. Any idea how I can do this? Following code is executed in Servlet context listener when server start-up Any help is greatly appreciated ?

    ClassLoader c =  Thread.currentThread().getContextClassLoader();
    while(c!=null) {
        System.out.println("CLASS Loader TYPE : " + c.getClass().getName());

        if(URLClassLoader.class.isInstance(c)){

            URLClassLoader urlclazz = (URLClassLoader) c;
            for(URL u : urlclazz.getURLs()) {
                System.out.println("SCANNING : " + u);

            }
        }else{
            System.out.println("CLASS Loader : " + c.getClass().getName());

        }
        c = c.getParent();
    }

Here is sample out put:

INFO   | jvm 1    | 2001/12/10 19:03:30 | CLASS Loader TYPE : org.apache.geronimo.kernel.classloader.JarFileClassLoader
INFO   | jvm 1    | 2011/12/10 19:03:30 | SCANNING : file:/C:/v3app/CORE/webapps/cmsample/WEB-INF/classes/
INFO   | jvm 1    | 2011/12/10 19:07:32 | CLASS Loader TYPE : sun.misc.Launcher$AppClassLoader
INFO   | jvm 1    | 2011/12/10 19:07:32 | SCANNING : file:/C:/v3app/CORE/lib/wrapper.jar
INFO   | jvm 1    | 2011/12/10 19:07:32 | SCANNING : file:/C:/v3app/CORE/bin/server.jar
INFO   | jvm 1    | 2011/12/10 19:07:32 | SCANNING : file:/C:/v3app/CORE/bin/shutdown.jar
INFO   | jvm 1    | 2011/12/10 19:07:39 | CLASS Loader TYPE : sun.misc.Launcher$ExtClassLoader                    ==   Boot strap Class Loader() 
INFO   | jvm 1    | 2011/12/10 19:07:41 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/activation.jar
INFO   | jvm 1    | 2011/12/10 19:07:42 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/CmpCrmf.jar
INFO   | jvm 1    | 2011/12/10 19:07:43 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/dnsns.jar
INFO   | jvm 1    | 2011/12/10 19:07:43 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/dtfj-interface.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/dtfj.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/dtfjview.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/gskikm.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/healthcenter.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/ibmcmsprovider.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/ibmjcefips.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/ibmjceprovider.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/ibmkeycert.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/IBMKeyManagementServer.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/ibmpkcs11impl.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/ibmsaslprovider.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/ibmxmlencprovider.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/jaccess.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/JawBridge.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/jdmpview.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/localedata.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/mail.jar
INFO   | jvm 1    | 2011/12/10 19:07:44 | SCANNING : file:/C:/v3java/CORE/jre/lib/ext/xmlencfw.jar

Solution

  • Following code is working:

    ClassLoader c =  Thread.currentThread().getContextClassLoader();
    Class<? extends ClassLoader > geronimoClazz =  null;
    Method parentesMethod = null;
    
    try{
                geronimoClazz = (Class<? extends ClassLoader>) Class.forName("org.apache.geronimo.kernel.config.MultiParentClassLoader");
                parentesMethod = geronimoClazz.getMethod("getParents", null);
            }catch(ClassNotFoundException e){
                // OK KEEP ME not Geronimo Container....it is ok..
            }catch(NoSuchMethodException ne){
                // OK KEEP ME HERE...
            }           
            java.util.Queue<ClassLoader> queue = new LinkedList<ClassLoader>();
            queue.add(c);
    
            while (!queue.isEmpty()) {
                c = queue.poll();
                if (URLClassLoader.class.isInstance(c)) {
                        URLClassLoader urlclazz = (URLClassLoader) c;
                    for (URL u : urlclazz.getURLs()) {
                        System.out.println("SCANNING : " + u);
    
                    }
    
                    if (geronimoClazz != null && 
                            geronimoClazz.isInstance(c) ){
    
                        try {
                            ClassLoader[]  loaders =  (ClassLoader[])parentesMethod.invoke(c,null);
                            if(loaders != null){
                                for(ClassLoader ld :loaders){
                                    // add each one of the class loader to queue..
                                    queue.offer(ld);
                                }
                            }
    
                        } catch (Exception e) {
    
                        }
                    }
    
                } else {
                    System.out.println("CLASS Loader Type : " + c.getClass().getName());
                }
                if(c.getParent() != null){
                    queue.offer(c.getParent());
                }
            }