为什么我无法使用WildFly中WEB-INF / classes的getResourceAsStream读取属性文件?

时间:2015-09-02 22:28:11

标签: java jboss classloader wildfly properties-file

我的电脑的操作系统是Windows 7 64位。

我在Eclipse中创建了一个非常简单的Dynamic Web Project应用程序:

我在app.properties目录中有WEB-INF/classes个文件,其中包含以下属性:

DefaultMaximumBatchSize=1000
DAOFactory=MSSQLSERVER

我有一个类AppProperties,它使用getResourceAsStream在启动时将上述文件读入一个Properties对象:

public class AppProperties {
   private static final Properties APP_PROPERTIES;
   static {
      InputStream inputStream = null;

      APP_PROPERTIES = new Properties();

      try {
         inputStream = AppProperties.class.getResourceAsStream("/WEB-INF/classes/app.properties");
         System.out.println("AppProperties: inputStream=" + inputStream);

         if (inputStream != null) {
            APP_PROPERTIES.load(inputStream);
         }
      } catch (Exception e) {
         System.out.println("AppProperties: Exception occured; e=" + e);
      }
   }

   public static String getValue(String propertyName) {
      if (propertyName == null || propertyName.equalsIgnoreCase(""))
         return null;
      else
         return APP_PROPERTIES.getProperty(propertyName);
   }
}

我有一个听众课程AppContextListener

public class AppContextListener implements ServletContextListener {

    public AppContextListener() {
    }

    public void contextInitialized(ServletContextEvent arg0) {
        String defaultMaxBatchSize = AppProperties.getValue("DefaultMaximumBatchSize");
        System.out.println("AppContextListener: contextInitialized(ServletContextEvent): defaultMaxBatchSize=" + defaultMaxBatchSize);
    }

    public void contextDestroyed(ServletContextEvent arg0) {
    }

}

我将应用程序部署到JBoss 4.2.3,运行JBoss 4.2.3并在server.log中获取此输出:

  

AppProperties:inputStream = java.io.FileInputStream@1adde645
  AppContextListener:contextInitialized(ServletContextEvent):defaultMaxBatchSize = 1000

完美。

然后我将相同的应用程序部署到WildFly 8.2.1,运行WildFly 8.2.1并在server.log中获得此输出:

  

AppProperties:inputStream = null
  AppContextListener:contextInitialized(ServletContextEvent):defaultMaxBatchSize = null

发生什么事了?从WEB-INF/classes目录中读取WildFly中属性文件的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

JBoss不应该有用。

Class.getResourceAsStream类路径中检索资源,而webapp根文件夹不在类路径中。

WEB-INF/classes文件夹是。使用getResourceAsStream("/app.properties"),并记住关闭流

 private static final Properties APP_PROPERTIES = new Properties();
 static {
   try (InputStream inputStream = AppProperties.class.getResourceAsStream("/app.properties")) {
      System.out.println("AppProperties: inputStream=" + inputStream);
      if (inputStream != null)
         APP_PROPERTIES.load(inputStream);
   } catch (Exception e) {
      System.out.println("AppProperties: Exception occured; e=" + e);
   }
}

现在,如果app.properties始终位于AppProperties.class旁边,而不是根目录,请将名称设为不合格(删除/)。即使你的类在一个包中(并且它在一个包中,对吗?),这也可以工作。

答案 1 :(得分:3)

Class.getResourceAsStream()在构成应用程序类路径的所有目录和jar中查找资源。

所以,如果你用

启动一个java程序
java -cp foo;bar.jar com.baz.Main

您使用SomeClass.class.getResourceAsStream("/blabla/app.properties"),类加载器会在app.properties下以及foo/blabla的{​​{1}}目录中查找blabla文件。

现在,在webapp中,构成webapp的类路径的是

  • 目录WEB-INF / classes
  • WEB-INF / lib下的所有jar文件

所以,如果你打电话

bar.jar

类加载器将在

中查找app.properties
  • AppProperties.class.getResourceAsStream("/WEB-INF/classes/app.properties")
  • /WEB-INF/classes/WEB-INF/classes

结论是,要加载位于<all the jar files of WEB-INF/lib>/WEB-INF/classes的{​​{1}}文件,您需要的是

app.properties

答案 2 :(得分:-1)

尝试

 Before : (null) vs testname
--------- Team ---------- 
(null)
---------------------------