这对我来说很奇怪:
1)我有课
public class Data {
private static String name;
public static String getName() {
return name;
}
public static void setName (String n){
Data.name = n;
}
}
在我的服务器(WAS liberty 中的 J2EE 应用程序)启动期间正确设置了此类变量名称 - 我想在整个服务器生命周期中缓存此数据。
2) 但是当我点击一个最终调用执行 getter 的代码的 URL 时:
Data.getName(); // this returns null??
谁能想到一个可能的原因?也无法调试,我很沮丧。
为了更多地说明我的问题,让我展示我的项目结构:
耳朵
CommonJar
战争1 战争2
我的 Data.java 在 CommonJar 中。此 Data.java 在由 web.xml 中注册的侦听器触发的服务器启动期间在 WAR1 中初始化,从这里我看到它已设置,并且我看到使用 Data.getName() 的非空值。--这是我的我原来的帖子中的第 1 步。
然后我在 WAR2 中有一个宁静的 HelloWorld 服务。当我调用这个 HelloWorld 服务时,我看到 Data.getName() 返回 null。- 这是我在原始帖子中的第 2 步。甚至不要想像语法类型的容易错误的东西,因为它不是那样的。
我的理论是:似乎 Data.java 在步骤 1 中由 WAR1 中的类加载器加载,然后在我的步骤 2 中由 WAR 2 加载,步骤 2 加载了一个空的 Data 类。
为了验证这个理论是否正确,我将 Data.java 初始化步骤移到了 WAR2 中,(我再次看到它被设置并且我看到使用 Data.getName() 的非空值),不同之处在于当我调用进入这个 HelloWorld 服务,我看到 Data.getName() 返回预期的非空值。这一步就是我所说的故障排除突破,因为它似乎表明我的理论是正确的。(但我无法通过在我的实际问题修复中移动代码来解决问题)
那么问题是如何修复以及如何直观地查看哪个类由哪个类加载器加载以及何时加载?同样基于 WAS Liberty 文档,默认的类加载器将是 parentsfirst,这意味着 Data.java 应该由父级(在本例中为 EAR)加载,所以我不应该首先遇到我的问题。
任何人,请指导如何进一步查看问题并解决它?谢谢。