请考虑以下内容:support.jar
public class SupportUtil{
private static Map<String, Resource> myResources;
void init(){
initResources();
}
}
然后我有2个独立的战争应用程序远程连接到同一个javaee服务器中的另一个ejb模块(目前使用wildfly 8)
war1 -> lib/support.jar
war2 -> lib/support.jar
ejb1 -> ear-lib/support.jar
我的问题是,基于模块类加载架构,三个模块是否会看到相同的Map off myResources(考虑到这是一个类变量,类变量由所有实例共享)
我需要澄清一下,对于wildfly或glassfish,类加载会如何影响这种行为。
答案 0 :(得分:0)
战争被认为是单个模块,因此WEB-INF / lib中定义的类与WEB-INF / classes中的类相同。战争中打包的所有类都将加载相同的类加载器。
默认情况下,EAR / lib目录是单个模块,每个WAR或EJB jar部署也是一个单独的模块。
每个模块都将使用自己的静态字段值加载自己的类实例。
子部署(wars和ejb-jars)总是依赖于父模块,这使他们可以访问EAR / lib中的类,但是它们并不总是彼此自动依赖。此行为通过ee子系统配置中的ear-subdeployments-isolated设置进行控制。
WAR通常依赖于EAR / lib。所以你的WAR模块会&#34;看到&#34; SupportUtil
的两个实例。当代码在WAR模块上下文中执行时(在Web应用程序请求期间),它将看到它自己的SupportUtil
的lib实例。当WAR远程(甚至本地!)调用EJB时,模块上下文切换到EJB,并且&#34;当前&#34; SupportUtil
的实例来自EAR / lib模块。 (免责声明:我没有对此进行测试,但这是我的理解。)
当模块可以访问同一个类的多个实例时,我不建议进入这个位置。我没有任何失败的故事要支持它,它似乎只是一个混乱的潜在来源:同一模块中的代码可以根据执行的执行方式看到不同的值。
但是有一个特例。
ear-subdeployments-isolated元素值对.war文件的隔离类加载器没有影响。即,无论此标志是设置为true还是false,.ear中的.war都将有一个隔离的类加载器,其中的.ear中的其他子部署将无法访问该.war的类。这是按照规范。
战争总是孤立的!所以你可以在多个WAR中拥有相同的jar /类,并且没有模块会看到更多相同类的多个实例。