gpt4 book ai didi

java - Tomcat如何设置处理HTTP请求的线程的上下文类加载器?

转载 作者:行者123 更新时间:2023-11-28 22:24:19 25 4
gpt4 key购买 nike

war 被部署到 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 线程执行的。

稍后,当请求到达 webapp 时,处理该请求的线程(http-nio-8080-exec-6 请参阅下面的日志)无法找到 下生成的类.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 作为他的上下文类加载器?

最佳答案

考虑使用 ClassLoader.getParent(),也许它们有共同的祖先

关于java - Tomcat如何设置处理HTTP请求的线程的上下文类加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54714401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com