在我的Web应用程序ear中,在ear中更改了位于名为“ A”的罐中的静态变量值。新更改的值是可见的,并保持原样。但是,只要在另一个名为“ B”的jar中访问该变量1,更新的值就不可用,而第一个初始化的值才可用。我使用JBoss,而jars在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中的变量,就会返回这些变量的初始值。

有办法解决吗?

最佳答案

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

但是要回答您的问题,因为您已经在使用静态变量了

警告:根据JAVA的官方文档,应谨慎使用反射,以免操作无法访问的对象

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

<Context crossContext="true">


而且您必须通过ServletContext和ClassLoader方法来加载类

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
}

10-01 12:05