因为项目需要,我们将项目打成war包后,比如是aaa.war,再复制一份重命名为bbb.war,同时部署到jboss里面去,两个包中的内容完全相同,唯一不同的是配置文件,因为配置文件决定了包的属性和访问的页面,我在初始化servlet的时候,将配置文件进行加载,代码如下:public class AuthConfFactory { private static Document document; public static Document initDocument(String path) {
if (null == document) {
InputStream fs = null;
File file = new File(path);
try {
fs = new FileInputStream(file);
document = Dom4jUtil.loadXML(fs);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fs != null)
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return document;
}
       
         /*
 * 根据xPath取配置文件
 */
public static String getValueByPath(String xPath) {
Document document = getDocument();
String value = null;// propertyMap.get(xPath);
if (value == null) {
Element element = Dom4jUtil.getElement(document, xPath);
value = element.getText();
// propertyMap.put(xPath, value);
}
return value;
}
}
但是出现一个问题,这里是静态的变量,当加载后,就不会加载,当加载了aaa.war中的配置文件后,bbb.war中就不会加载,然后访问bbb.war服务,获取的配置信息就是aaa.war中的信息。
有没有办法解决,aaa.war和bbb.war分别读自己的配置信息?

解决方案 »

  1.   

    两个war加载会使用不同的Classloader加载war里的类,我觉得这里的静态变量不会冲突。当然,没实际试过。
    楼下请用事实说话。
      

  2.   

    我很同意楼上的观点,我也不认为他们会有冲突,不过我真没有在jboss中实践过  没有发言权楼下来解答.
      

  3.   

    就是会冲突我才来发帖咨询的。aaa.war加载了配置文件,放到静态变量中,然后bbb.war检测到静态变量中有数据了,就不加载bbb.war中的配置了我也觉得奇怪,是2个上下文环境,但是实际就是这样的。
      

  4.   

    你那个静态类是自己实现的分别放在web-inf/lib中的jar或者是编译后的class或jar还是共享的?如果jboss下类路径已经包含你那个静态类,那是会有问题的;如果是和jboss类路径没关系,不会有影响。检查下jboss各个classloader下加载的jar。
      

  5.   

    现在唯一的办法,就是修改JBoss 4.0.5 GA\server\default\deploy\jbossweb-tomcat55.sar\META-INF目录下的jboss-service.xml的<attribute name="UseJBossWebLoader">true</attribute>属性,true,改为false,才不会冲突。