每个war文件没有JVM实例?

时间:2011-10-10 16:52:55

标签: java

根据我的理解,每个war文件将有一个jvm实例和一个类加载器层次结构。 对吗?两个问题: -

问题1: - 如果我在war文件中打包我的servlet类和业务类(打包在jar文件中)。这里war文件包含jar文件和servlet类。如果我尝试访问业务类中servlet中声明的静态全局变量,我能做到正确吗?因为这里只有一个jvm实例和类加载器层次结构

问题2: - 如上所述,如果我将我的servlet类和业务类打包在两个不同的war文件中,这两个war文件都打包在同一个ear文件下,那么如果我尝试访问业务类中servlet中声明的静态全局变量, i不能这样做。这是正确的吗?因为这里将是每个war文件的两个jvm实例和类加载器层次结构

3 个答案:

答案 0 :(得分:4)

当然整个应用程序服务器在一个JVM中运行(至少对我所知的所有应用程序服务器都是如此)。无需启动单独的JVM即可为每个Web应用程序提供专用的类加载器,以查看不同类型的版本。

  

因此war文件包含jar文件和servlet类。如果我尝试访问业务类中servlet中声明的静态全局变量,我可以做到正确吗?

您可能,但不应该,因为如果业务层依赖于表示层中特定类的存在,它会违反应用程序的分层。

  

如果我将我的servlet类和业务类打包在两个不同的war文件中,这两个war文件都打包在同一个ear文件下,那么如果我尝试访问业务类中servlet中声明的静态全局变量,我就不能这样做。它是否正确?

同样,这是糟糕的设计。此外(据我所知),规范并未规定所有应用程序服务器都遵循的特定行为,因此这可能取决于您选择的应用程序服务器及其配置。

答案 1 :(得分:2)

Web容器没有理由为每个Web应用程序启动一个新的JVM实例(使用war文件部署或通过简单地将战争内部的内容复制到例如'./webapps/'目录中Apache Tomcat)。通常使用不同的类加载器启动不同的Web应用程序,以便将它们彼此安全地分开。这不是标准,只是通常由Web容器完成的事情。

Java中没有'全局静态'变量(不是这个名字),你的意思是'公共静态'类字段/变量。这些只能由同一个类加载器加载的类访问(包含在同一个Web应用程序中)。 (还假设他们可以访问包含类,因为类可能具有默认访问权限,不允许某些类(甚至由同一个类加载器加载)访问其成员)。

你尝试从不同的战争中获取东西的方式是糟糕的设计,如 meriton 的回答中所述。

1)使用ServletContex在同一个网络应用中共享数据,如 gertas '回答中所述。

2)如果您确实需要,可以使用JNDI 在不同的网络应用之间共享数据。

3)还要考虑你真正需要的是不是共享数据,而是消息传递还是完整的持久性机制。

答案 2 :(得分:1)

你是对的,每个WAR一个类加载器,在WAR之间分隔静态变量作用域,但不是两个JVM实例。通常,servlet容器在一个JVM下运行。

但是使用静态变量来交换数据(常量是可以的)是糟糕的设计,我建议使用ServletContext。另请参阅Servlet context scope vs global variable

相关问题