繁体   English   中英

Tomcat 9 通用类加载器是 URLClassLoader 吗?

[英]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用于通用和以后的类加载器。

测定方法:

  1. 对 webapp 的初始测试已经确认 webapps 使用了 URLClassLoader。 但是由于 Tomcat 使用自己的 ClassLoader 启动 webapps,这并不能回答会发生什么......在 Tomcat 到达 webapp 初始化阶段之前

  2. 因此,为了在 webapp 初始化阶段之前识别通用类加载器使用的类加载器,我不得不使用一些奇怪的技巧:

  • 将 Tomcat 日志记录切换到 log4j
  • 创建了一个自定义附加程序
  • 将自定义附加程序放在公共库中
  • 配置 log4j.xml 以使用自定义附加程序
  • 向附加程序添加代码以显示附加程序使用的类加载器的名称和 class。
  • 由于 log4j 日志记录在初始化任何 web 应用程序之前由 Tomcat 激活,如 Z2E0253414141F0D1926ZDF1 条目所示,它回答了 76 个问题。

我希望这个答案对那些偶然发现与 Java 9 及更高版本相同的问题的人有用,并在他们谷歌时到达它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM