繁体   English   中英

Glassfish环境用于具有共同依赖关系的多个应用程序

[英]Glassfish environment for multiple applications with common dependency

我有一个正在苦苦挣扎的问题。 问题是我什至不知道我应该在Google上确切搜索什么,所以这就是为什么我要求在SO上做一个简短的解释。

假设我有三个项目:A,B和C。A是B和C的依存关系。例如,B和C是Web服务,可以在Glassfish中部署。 在A中,有一个带有静态字段的类,比如说一个int 构建项目B时, static int值为3。然后,构建项目C,但将static int的值更改为4。

问题是:当我们将B和C都部署到Glassfish上时,这些应用程序是否在单独的“环境”中运行,其中static int在每个环境中具有不同的值(B的环境中为3,C的环境中为4)还是存在?只是一个static int

LE:B和C都部署在同一个Glassfish域中。 Glassfish版本为3.1.1。

如果“ A代表B”和“ A代表C”不同,则需要为B和C创建一个部署,每个部署都包含自己的A副本。

最简单的方法很可能是将B包围A_for_B.jar的单独WAR和将C包围A_for_C.jar的C单独的WAR。

The problem is that I do not even know what exactly I should search for on google, so that's why I am asking for a short explanation here on SO.

您要搜索的是“ Classloader”。 这种类型的对象负责加载Java类。 JVM加载的每个类都由其完全限定名称加载它的类加载器实例标识。 这意味着在一个JVM中,您可以有几个名为“ com.example.Test”的类,每个类都由不同的类加载器加载-每个类都有自己的静态字段。 而且,这些类在运行时会被认为是不同的:将一个类加载器中的“ com.example.Test”转换为其他类加载器中的“ com.example.Test”将以ClassCastException结尾。

为了避免多次加载多个公共类(例如java.util.List)的情况,通常将类加载器保持在干净的层次结构中。 每个类加载器都知道其“父级”,即负责加载“更多通用类”的类加载器。 当我们尝试加载一个类(通常是“按名称”发生)时,例如“ com.example.OtherTest”,当前的类加载器会尝试询问其父级是否能够加载它(而父级又会询问其父级) , 等等)。 这样,每个类都由能够加载它的最通用的类​​加载器加载(即使其他类加载器具有某些可用的版本,标准的引导类加载器也会始终加载java.lang.String)。

部署战争时,glassfish会为其创建一个单独的类加载器。 类加载器知道如何从WEB-INF / lib和WEB-INF / classs加载类。 它的父级是(或至少是祖父级的)域类加载器,对于所有应用程序都是通用的。 因此,在应用程序类加载器加载任何类之前,它将要求Glassfish进行操作。

整个过程是可配置的,使您仅可以将一个普通库的一个副本加载到JVM中(例如,如果将库放入-AFAIR-domain1 / lib / ext,它们将可供域类加载器使用,它们是每个应用程序的类加载器;或者甚至可以将其放在JRE的lib / ext文件夹中,并提供给主类加载器使用,这将为您运行的任何应用程序加载类。 在这种情况下,它们将共享静态字段。 或者,您可以通过war类加载器加载您的库,并使所有静态字段“专用”于您的应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM