Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个war文件的JVM实例数?_Java - Fatal编程技术网

Java 每个war文件的JVM实例数?

Java 每个war文件的JVM实例数?,java,Java,据我所知,每个war文件将有一个jvm实例和一个类装入器层次结构对吗?两个问题:- 问题1:如果我在war文件中打包我的servlet类和业务类(打包在jar文件中),那么这里的war文件包含jar文件和servlet类。若我尝试访问在业务类的servlet中声明的静态全局变量,我能做得正确吗?因为这里只有一个jvm实例和类加载器层次结构 问题2:在与上述相同的场景中,如果我将servlet类和业务类打包在两个不同的war文件中,这两个war文件都打包在同一个ear文件中,那么如果我尝试访问业务

据我所知,每个war文件将有一个jvm实例和一个类装入器层次结构对吗?两个问题:-

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


问题2:在与上述相同的场景中,如果我将servlet类和业务类打包在两个不同的war文件中,这两个war文件都打包在同一个ear文件中,那么如果我尝试访问业务类中servlet中声明的静态全局变量,我无法执行。是否正确?因为这里将有两个jvm实例和每个war文件的类加载器层次结构

当然,整个应用程序服务器在一个jvm中运行(至少我知道的所有应用程序服务器都是这样)。不需要启动单独的JVM来为每个web应用程序提供一个专用的类加载器,该加载器可以查看不同(版本的)类

所以这里的war文件包含jar文件和servlet类。若我尝试访问在业务类的servlet中声明的静态全局变量,我能做得正确吗

您可能可以,但不应该这样做,因为如果业务层依赖于表示层中特定类的存在,那么这将违反应用程序的分层

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


同样,这是一个糟糕的设计。此外(据我所知),该规范并不要求所有应用服务器都遵守特定的行为,因此这可能取决于您对应用服务器及其配置的选择。

您是对的,每个WAR一个类装入器,在WAR之间分离静态变量作用域,但不完全是两个JVM实例。通常servlet容器在一个JVM下运行


但我建议使用静态变量交换数据(常数是可以的)是一种糟糕的设计。另请参见。

web容器没有理由为每个web应用程序启动新的JVM实例(可以使用war文件部署,也可以简单地将war中的内容复制到Apache Tomcat中的“/webapps/”目录中)。不同的web应用程序通常使用不同的类加载器启动,以安全地将它们彼此分离。这不是标准,只是web容器通常完成的方式

Java中没有“全局静态”变量(不是这个名称),您的意思是“公共静态”类字段/变量。只有同一类加载器加载的类(包含在同一web应用程序中)才能访问这些类。(还假定它们可以访问包含类,因为类可能具有默认访问权限,这会禁止某些类(即使是由同一类加载器加载的)访问其成员)

正如梅里顿在回答中所解释的那样,你试图从不同的战争中获取信息的方式是糟糕的设计

1) 使用ServletContex在同一web应用程序中共享数据,如gertas的回答所述

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


3)还考虑如果您真正需要的不是共享数据,而是消息传递或完全持久化机制。

作为更新,在集群Web应用程序的情况下,每个JVM每一个Web应用程序都有一个servlet上下文。请看我对@meriton的评论,我需要在不同的warsHi meriton中设置相同的系统属性。我完全同意你的观点,这是一个糟糕的设计。基本上,我问这个问题是为了理解基本原理,这是唯一的意图。现在请你回答这两个问题(应用服务器是weblogic)?不知道weblogic,我无法给出比上述猜测更明确的答案。我需要在同一台机器上为不同的环境部署同一场战争(preprod、prod)。这些war使用不同的值设置相同的系统属性。。。我想用不同的jvm发动每一场战争。我是否被迫在不同的端口上复制和粘贴jboss?@vault,虽然有点晚了,但您需要两个不同的应用程序服务器,因为每个应用程序服务器将在单独的JVM中运行,因此可能具有不同的系统属性(只要属性基于环境)。我建议每个war的web.xml文件都有不同的注入变量。在部署之前,您可以将一个web.xml中的值切换到它自己的唯一值,反之亦然,在另一个war的web.xml中。我在实验室和prod环境之间使用不同的IP和密码进行此操作。嗨,gertas,我同意你的观点,使用静态变量是一种糟糕的设计。基本上,我问这个问题是为了理解基本原理,这是唯一的意图。现在想问你对这两个问题的回答吗?你说“不完全是两个JVM实例。通常servlet容器在一个JVM下运行“所以你的意思是说两个war文件都有自己的classloder,但在同一个JVM实例下运行。对吗?通常大多数常见的实现都是这样工作的,它们使用一个JVM实例和类装入器层次结构-请参阅。应用程序是分开的,但它们可以共享放入“共享”中的类从应用程序类加载器继承的“共享”类加载器加载的目录-这是Tomcat案例。