如何访问WAR应用程序中的模块本地属性文件?

时间:2013-11-16 18:46:46

标签: java web-applications resources classpath war

我有以下Web应用程序结构:

WAR
  - ...
  - WEB-INF
    - lib
       - module1.jar
          - messages.properties
          - MyClassModule1.class
       - module2.jar
          - messages.properties
          - MyClassModule2.class
    - classes
       - messages.properties
       - MyClass.class

我希望模块内的类能够访问相应模块的本地messages.properties,例如我希望MyClassModule1访问messages.properties内的WEB-INF/lib/module1.jar,而不是WEB-INF/classes中的MyClassModule1.class.getClassLoader().getResourceAsStream("messages.properties"); Thread.currentThread().getContextClassLoader().getResourceAsStream("messages.properties"); ,因为它现在似乎正在发生。

我测试的方法如下:

WEB-INF/classes/messages.properties

他们都给我WEB-INF/lib/module1.jar!/messages.properties,而不是messages.properties

当我从模块内部调用以前的getResourceAsStream(...)方法时,是否有非triky 方法来获取本地*.jar

要考虑的一些限制因素:

  • 属性文件必须具有所有相同的名称
  • 它们必须放在WEB-INF/classes/文件的根目录或根目录下 {{1}} WAR文件,如示例中所示。

1 个答案:

答案 0 :(得分:0)

{
    Properties props = new Properties();
    try 
    {
   props.load(MyClass.class.getResourceAsStream("/someProps.properties"));    
} catch (IOException e) 
    {
        e.printStackTrace();
    }
    someProperty = props.getProperty("someKey");
}

它在Eclipse中工作,因为在启动应用程序时,系统类加载器配置了jar作为其类路径的一部分。 (例如,java -jar my.jar将在系统类加载器中加载my.jar。)Web应用程序不是这种情况 - 应用程序服务器使用复杂的类加载将Web应用程序彼此隔离,并与应用程序服务器的内部隔离。例如,请参阅tomcat类加载器方法,以及使用的类加载器层次结构图。