Как Tomcat устанавливает загрузчик класса контекста потоков, обрабатывающих HTTP-запрос? - PullRequest
0 голосов
/ 15 февраля 2019

Война развернута в Tomcat 8.5.27.Во время этого развертывания классы сущностей динамически добавляются в файл persistence.xml на пути к классам.

Затем Hibernate 5.1.2 запрашивается загрузить модуль сохранения, содержащий эти классы сущностей.Они добавляются к экземпляру java.net.FactoryURLClassLoader.Вот выдержка из журнала развертывания, показывающая дамп этого загрузчика классов:

[INFO] [talledLocalContainer] 15-Feb-2019 15:03:46.722 INFOS [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ** SEARCHING: generated.com.company.Baz
[INFO] [talledLocalContainer] 15-Feb-2019 15:03:46.727 INFOS [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ClassLoader: java.net.FactoryURLClassLoader@701f7082
[INFO] [talledLocalContainer]   class generated.com.company.Foo
[INFO] [talledLocalContainer]   class generated.com.company.Bar
(...)
[INFO] [talledLocalContainer]   class generated.com.company.GooClassLoader: ParallelWebappClassLoader
[INFO] [talledLocalContainer]   context: webappContext
[INFO] [talledLocalContainer]   delegate: false
[INFO] [talledLocalContainer] ----------> Parent Classloader:
[INFO] [talledLocalContainer] java.net.URLClassLoader@45d6cf48
[INFO] [talledLocalContainer] 
[INFO] [talledLocalContainer]   class com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer
[INFO] [talledLocalContainer]   class javax.ws.rs.core.Application
(...)

Обратите внимание, что все вышеперечисленные действия кажутся выполненными потоком localhost-startStop-1.

Позже, когдазапрос попадает в веб-приложение, поток, обрабатывающий этот запрос (http-nio-8080-exec-6 см. в журнале ниже), не может найти классы в generated.com.company.Вот выдержка из дампа этого загрузчика класса потока:

[INFO] [talledLocalContainer] 15-Feb-2019 15:04:18.705 INFOS [http-nio-8080-exec-6] org.apache.catalina.core.ApplicationContext.log  ** SEARCHING: generated.com.company.Foo
[INFO] [talledLocalContainer] 15-Feb-2019 15:04:18.724 INFOS [http-nio-8080-exec-6] org.apache.catalina.core.ApplicationContext.log ClassLoader: ParallelWebappClassLoader
[INFO] [talledLocalContainer]   context: webappContext
[INFO] [talledLocalContainer]   delegate: false
[INFO] [talledLocalContainer] ----------> Parent Classloader:
[INFO] [talledLocalContainer] java.net.URLClassLoader@45d6cf48
[INFO] [talledLocalContainer] 
[INFO] [talledLocalContainer]   class com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer
[INFO] [talledLocalContainer]   class javax.ws.rs.core.Application
(...)

Вот код, используемый для генерации дампа:

private static void dumpLoadedClasses() {
        try {
            ClassLoader myCL = Thread.currentThread().getContextClassLoader();
            StringBuilder sb = new StringBuilder();
            while (myCL != null) {
                sb.append("ClassLoader: " + myCL);
                for (Iterator<Class<?>> iter = list(myCL); iter.hasNext();) {
                    sb.append("\n\t" + iter.next());
                }
                myCL = myCL.getParent();
            }

            log.info(sb.toString());
        } catch (Exception e) {
            log.warn("", e);
        }
}

Почему http-nio-8080-exec-6 не имеет java.net.FactoryURLClassLoader@701f7082 как его загрузчик класса контекста?

1 Ответ

0 голосов
/ 16 февраля 2019

Рассмотрите возможность использования ClassLoader.getParent (), возможно, у них общий предок

...