Сканирование пользовательских аннотаций под Geronimo с контейнером Tomcat - PullRequest
1 голос
/ 11 декабря 2011

Как получить доступ к банкам, которые находятся в «shared / lib» каталоге Geronimo Server?
Я использую следующий код для обхода иерархии загрузчика классов, но не могу получитьJAR-библиотеки находятся в папке «shared / lib».Есть идеи, как я могу это сделать?Следующий код выполняется в прослушивателе контекста сервлета при запуске сервера. Любая помощь очень важна?

    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();
    }

Вот пример выхода:

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

1 Ответ

1 голос
/ 14 декабря 2011

работает следующий код:

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());
            }
        }
...