我知道servlet容器(如Apache )在JVM的单个实例中运行,这意味着它的所有servlet都将在同一个进程中运行。
我还知道servlet容器的体系结构意味着每个web应用程序都存在于自己的上下文中,这意味着它与其他web应用程序是隔离的。
如下所示:

承认每个web应用程序是孤立的,我希望您可以创建两个相同web应用程序的副本,更改每个应用程序的名称和上下文路径(以及任何其他相关配置),并并行运行它们,而不影响另一个。this question的答案似乎支持此视图。
然而,一位同事基于他们尝试的经验而不同意这一点。
他们使用了一个web应用程序,并试图在同一个servlet容器中运行两个单独的实例(具有不同的名称等),并且遇到了与这两个实例相冲突的问题(我无法详细说明,因为我没有参与到该工作中)。
基于此,他们认为,由于web应用程序运行在相同的进程空间中,它们不能被隔离,类属性之类的东西最终会被无意中共享。This answer似乎提出了同样的观点
这两个视图似乎不兼容,所以我问您:Do servlet容器防止部署到同一个容器中的web应用程序相互冲突??。
如果是,他们是怎么做到的?
如果没有,为什么会发生干扰?
最后,在什么情况下可以分离web应用程序冲突并导致彼此干扰?,可能涉及文件系统上的资源、本机代码或数据库连接的场景?
发布于 2010-12-22 21:22:38
简而言之,servlet容器通过对每个应用程序使用单独的类加载器来隔离应用程序--由单独的类加载器加载的类(即使来自相同的物理类文件)是彼此不同的。但是,类加载器共享一个公共父类加载器,容器可能提供许多其他容器范围的资源,因此应用程序之间并不完全隔离。
例如,如果两个应用程序共享一些公共代码,每个应用程序在war中都包含相同的jar,那么每个应用程序将从jar加载它们自己的类实例,并且一个应用程序中的一个类的静态变量(例如单例)将与另一个应用程序中相同类的静态变量不同。
现在,举个例子,应用程序尝试使用java.util.Logger (大概不会在war文件中包含自己的Logger类实例)。每个应用程序自己的类加载器都不会在war文件中找到类,因此它们将服从于父类加载器,后者可能是共享的、容器范围的类加载器。父类加载器将加载Logger类,然后两个应用程序共享相同的Logger类。
发布于 2010-12-22 20:49:30
同一个容器中的Servlets将共享一些资源。我认为在同一个容器中部署同一个web应用程序两次应该是可能的,前提是给每个应用程序指定不同的名称,并且它们不会在特定的资源上发生冲突。理论上,这将与部署两个不同的servlet相同,这些servlet恰好具有相同的实现,我们一直在这样做。
一些共享的资源,从我的头顶(我不是一个专家,所以不要引用这些!):
在Tomcat/suspect/lib (Tomcat 5)或tomcat/lib (Tomcat 6)中,tomcat-users.xml
毫无疑问还有更多。
如果您使用的是安全管理器,那么其中的许多东西都是由安全管理器保护的。
发布于 2010-12-22 21:02:59
我相信隔离在类加载器中。即使两个应用程序使用相同的类名和包,它们的类加载器也将加载与应用程序一起部署的类加载器。
https://stackoverflow.com/questions/4513461
复制相似问题