[英]Is Tomcat 9 common classloader a URLClassLoader?
我的所有应用程序都使用了一个自定义库,该库通常位于 catalina.properties 的公共库集中。 它假定类加载器是一个 URLClassLoader。
在 Java 8 下,即使是基本的 AppClassLoader 也可以转换为 URLClassLoader,Tomcat 8 使用的类加载器也可以(我怀疑它是由 Z8F72E28063C30CF74684FB 设计者制作的自定义类加载器)。
那么,在 Java 9-11 中,在 Tomcat 9 中……我可以期望通用类加载器是 URLClassLoader 吗? 如果不是,那是什么? 有没有办法让我设计一个可以插入的 URLClassloader 来通用它?
谢谢。
TL;DR: Tomcat 9 的通用类加载器是一个URLClassLoader
要检查 Tomcat 应用程序使用了哪些类加载器,请创建一个小 servlet 以列出ClassLoader
层次结构。
@WebServlet("/testcl")
public class ClassLoaderTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
for (ClassLoader cl = Thread.currentThread().getContextClassLoader(); cl != null; cl = cl.getParent()) {
out.println(cl.getClass().getName());
if (cl instanceof URLClassLoader)
for (URL url : ((URLClassLoader) cl).getURLs())
out.println(" " + url);
}
}
}
部署到 Tomcat 并打开 servlet 的页面,例如http://localhost:8080/test/testcl
如果类加载器是URLClassLoader
,则显示的页面列出类加载器和 URL。
从下面的output可以看出, webapp类加载器和普通类加载器都是URLClassLoader的:
output 中的第一个是 Tomcat WebApp类加载器,列出了test
webapp 的WEB-INF/classes
文件夹。 它还会列出WEB-INF/lib
文件夹中的任何 jar 文件(如果有的话)。
它是一个URLClassLoader
。
The 2nd in the output is the Tomcat Common classloader, listing the Tomcat lib
folder and all the jar files found in that folder.
它是一个URLClassLoader
。
output中的第3个是Java App类加载器,代表Java应用程序的CLASSPATH。
在 Java 8 及更早版本中,它是URLClassLoader
。 在 Java 9 及更高版本中,由于 Module 系统,它不再是一个简单的URLClassLoader
。
output 中的第 4 个是 Java扩展/平台类加载器。
在 Java 8 及更早版本中,它是URLClassLoader
。 在 Java 9 及更高版本中,由于 Module 系统,它不再是一个简单的URLClassLoader
。
output 中未显示,因为它由null
值表示,是 Java引导类加载器。
样品 output 与 Java 8
org.apache.catalina.loader.ParallelWebappClassLoader
file:/C:/prog/tomcat-9.0.27/webapps/test/WEB-INF/classes/
java.net.URLClassLoader
file:/C:/prog/tomcat-9.0.27/lib/
file:/C:/prog/tomcat-9.0.27/lib/annotations-api.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina-ant.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina-ha.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina-storeconfig.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina-tribes.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina.jar
file:/C:/prog/tomcat-9.0.27/lib/ecj-4.13.jar
file:/C:/prog/tomcat-9.0.27/lib/el-api.jar
file:/C:/prog/tomcat-9.0.27/lib/jasper-el.jar
file:/C:/prog/tomcat-9.0.27/lib/jasper.jar
file:/C:/prog/tomcat-9.0.27/lib/jaspic-api.jar
file:/C:/prog/tomcat-9.0.27/lib/jsp-api.jar
file:/C:/prog/tomcat-9.0.27/lib/servlet-api.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-api.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-coyote.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-dbcp.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-cs.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-de.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-es.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-fr.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-ja.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-ko.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-pt-BR.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-ru.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-zh-CN.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-jdbc.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-jni.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-util-scan.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-util.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-websocket.jar
file:/C:/prog/tomcat-9.0.27/lib/websocket-api.jar
sun.misc.Launcher$AppClassLoader
file:/C:/prog/tomcat-9.0.27/bin/bootstrap.jar
file:/C:/prog/tomcat-9.0.27/bin/tomcat-juli.jar
sun.misc.Launcher$ExtClassLoader
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/access-bridge-64.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/cldrdata.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/dnsns.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/jaccess.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/jfxrt.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/localedata.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/nashorn.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/sunec.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/sunjce_provider.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/sunmscapi.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/sunpkcs11.jar
file:/C:/prog/Java64/jdk1.8.0_181/jre/lib/ext/zipfs.jar
样品 output 与 Java 14
org.apache.catalina.loader.ParallelWebappClassLoader
file:/C:/prog/tomcat-9.0.27/webapps/test/WEB-INF/classes/
java.net.URLClassLoader
file:/C:/prog/tomcat-9.0.27/lib/
file:/C:/prog/tomcat-9.0.27/lib/annotations-api.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina-ant.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina-ha.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina-storeconfig.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina-tribes.jar
file:/C:/prog/tomcat-9.0.27/lib/catalina.jar
file:/C:/prog/tomcat-9.0.27/lib/ecj-4.13.jar
file:/C:/prog/tomcat-9.0.27/lib/el-api.jar
file:/C:/prog/tomcat-9.0.27/lib/jasper-el.jar
file:/C:/prog/tomcat-9.0.27/lib/jasper.jar
file:/C:/prog/tomcat-9.0.27/lib/jaspic-api.jar
file:/C:/prog/tomcat-9.0.27/lib/jsp-api.jar
file:/C:/prog/tomcat-9.0.27/lib/servlet-api.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-api.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-coyote.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-dbcp.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-cs.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-de.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-es.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-fr.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-ja.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-ko.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-pt-BR.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-ru.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-i18n-zh-CN.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-jdbc.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-jni.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-util-scan.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-util.jar
file:/C:/prog/tomcat-9.0.27/lib/tomcat-websocket.jar
file:/C:/prog/tomcat-9.0.27/lib/websocket-api.jar
jdk.internal.loader.ClassLoaders$AppClassLoader
jdk.internal.loader.ClassLoaders$PlatformClassLoader
回答:
Tomcat 9 仍然将 URLClassLoader用于通用和以后的类加载器。
测定方法:
对 webapp 的初始测试已经确认 webapps 使用了 URLClassLoader。 但是由于 Tomcat 使用自己的 ClassLoader 启动 webapps,这并不能回答会发生什么......在 Tomcat 到达 webapp 初始化阶段之前。
因此,为了在 webapp 初始化阶段之前识别通用类加载器使用的类加载器,我不得不使用一些奇怪的技巧:
我希望这个答案对那些偶然发现与 Java 9 及更高版本相同的问题的人有用,并在他们谷歌时到达它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.