簡體   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