静态值在单独的罐子中不可见

时间:2015-06-24 10:17:31

标签: java java-ee jboss

在我的网络应用程序中,位于名为“A”的jar中的静态变量值会在耳边发生变化。这个新改变的价值是可见的,并保持不变。但是,只要在名为“B”的另一个jar中访问该variablel,更新的值就不可用,并且第一个初始化值仅可用。我使用JBoss和jar都在tomcat-sar文件夹中。  例如:

//默认Ajar的静态变量状态;

 Ajar.Aclass.staticVariableA = "initializedValue";  

inside my utility classes in ear, Ajar.Aclass.staticVariableA = "NewValue";  

//然后,当位于战争中的Bjar现在也可以访问Ajar的静态变量时,

 System.out.println("value in B jar : " + Ajar.Aclass.staticVariableA );

//这会在B jar中打印值:initializedValue

根据我的意思,A.jar的值在耳朵上下文中是有效的,因为它在耳内被初始化。 B.jar有自己的上下文,每当调用A.jar中的变量时,返回这些变量的初始值。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使用跨上下文servletContext属性作为直接进场

但要回答你的问题,因为你已经使用静态变量进步了

警告:根据JAVA的官方文档,应谨慎使用反射,这样您就不会操纵无法访问的对象

将以下crossContext =“true”放在TOMCAT_HOME \ conf \ context.xml

<Context crossContext="true">

您必须通过ServletContext和ClassLoader Methodology

加载Class
ServletContext context = request.getSession().getServletContext();
ServletContext othercontext = context.getContext("/otherwarrooturl");

现在你有了上下文和其他上下文,让我们假设目标类是com.debora.MyClass

我们将使用其他上下文

加载该类
try {
     Class myclass = othercontext.loadClass("com.debora.MyClass");
     Field[] fields =  myclass.getDeclaredFields();
     //....your reflection program to fetch the static value...
     //....or using method invoke...
}catch (Exception e) {
    e.printStackTrace();
} finally {
    //your cleanup code
}