【问题标题】:How does JVM uniquely identify JSP's with same name in different folder across different applicationsJVM如何在不同应用程序的不同文件夹中唯一标识具有相同名称的JSP
【发布时间】:2025-12-13 13:30:20
【问题描述】:

JVM如何在不同应用程序的不同文件夹中唯一标识同名的JSP?

更清楚地说,假设两个应用程序(战争)部署在服务器 A1 和 A2 上。现在 A1 在文件夹 F11 和 F12 中有 Random.jsp(2 个名称相同但代码不同的 jsp),同样 A2 在 F21 和 F22 中有 Random.jsp。

当部署代码并将 jsp 转换为 Servlet 时,我相信所有 4 个 JSP 的 Servlet 名称也会相同。那么JVM如何为各自的请求唯一地识别它们呢?

如果它仅限于单个应用程序,我会假设 JVM 在 servlet 转换期间会使用文件夹名称作为包,但它是否可以跨应用程序工作。

另外请大家指教,JVM 是通过为生成的 servlet 声明不同的包还是使用不同类的一些内部映射结构来处理这种区别(这第二个选项听起来很奇怪)

【问题讨论】:

    标签: jsp servlets jvm classloader


    【解决方案1】:

    这取决于实现。 TOMCAT 的做法是使用 work 目录,其中包含 A1.warA2.war 的单独文件夹。这样,尽管“Random.jsp”为两个 WAR 生成相同的 servlet 名称,但它们被放置在不同的文件夹中,因此不会造成混淆。

    例子:

    /usr/java/tomcat/work/Catalina/localhost/A1/org/apache/jsp/Random_jsp.java
    /usr/java/tomcat/work/Catalina/localhost/A2/org/apache/jsp/Random_jsp.java
    

    【讨论】:

      【解决方案2】:

      您提到的问题不仅限于 JSP 文件(被翻译成类)。确保容器内不同的 Web 应用程序不会相互干扰是 Web 容器的工作。并且每个应用程序都可以拥有具有相同包和相同名称的类文件。最佳示例:每个 Webapp 都有一些通用库,例如​​ log4j,但版本不同。

      解决方案是以非常有创意的方式使用 Java 的ClassLoader。一个类只有加载它的类加载器和所有子类加载器(类加载器形成树状层次结构)才知道。 webcontainer基本上为每个WebApp打开了一个新的classloader,每个Classloader都可以加载同一个类——Bingo。

      注意:只要一切都正确完成,它就可以很好地工作。但是如果这些类的实例“泄漏”到其他应用程序中,就会发生奇怪的事情......像

      这样的消息
      ClassCastException....instance of class xyz.Foo is not an instance of class xyz.Foo
      

      在这种情况下并不少见。第一次看到你会挠头。

      【讨论】:

        最近更新 更多