Java 为什么我不能在WildFly中使用WEB-INF/classes中的getResourceAsStream读取属性文件?

Java 为什么我不能在WildFly中使用WEB-INF/classes中的getResourceAsStream读取属性文件?,java,jboss,classloader,wildfly,properties-file,Java,Jboss,Classloader,Wildfly,Properties File,我的电脑的操作系统是Windows 7 64位 我在Eclipse中创建了一个非常简单的动态Web项目应用程序: 我在WEB-INF/classes目录中有一个app.properties文件,其中包含以下属性: DefaultMaximumBatchSize=1000 DAOFactory=MSSQLSERVER 我有一个类AppProperties,它在启动时使用getResourceAsStream将上述文件读入Properties对象: public class AppProperti

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

我在Eclipse中创建了一个非常简单的动态Web项目应用程序:

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

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:

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

AppProperties:inputStream=java.io。FileInputStream@1adde645 AppContextListener:contextInitializedServletContextEvent:defaultMaxBatchSize=1000

太好了

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

AppProperties:inputStream=null AppContextListener:contextInitializedServletContextEvent:defaultMaxBatchSize=null


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

JBoss不应该工作

从类路径检索资源,而webapp根文件夹不在类路径中

WEB-INF/classes文件夹为。使用getResourceAsStream/app.properties,并记住关闭流:


现在,如果app.properties始终位于AppProperties.class旁边,而不是位于根目录下,则将名称设为unqualified并删除/。即使您的类在一个包中并且它在一个包中,这也会起作用,对吗?

JBoss不应该起作用

从类路径检索资源,而webapp根文件夹不在类路径中

WEB-INF/classes文件夹为。使用getResourceAsStream/app.properties,并记住关闭流:

现在,如果app.properties始终位于AppProperties.class旁边,而不是位于根目录下,则将名称设为unqualified并删除/。即使您的类在包中并且在包中,这也会起作用,对吗?

class.getResourceAsStream在构成应用程序类路径的所有目录和JAR中查找资源

所以,如果你用

java -cp foo;bar.jar com.baz.Main
如果使用SomeClass.class.getResourceAsStream/blabla/app.properties,类加载器将在foo/blabla下和bar.jar的blablabla目录中查找app.properties文件

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

目录WEB-INF/classes WEB-INF/lib下的所有jar文件 所以,如果你打电话

AppProperties.class.getResourceAsStream("/WEB-INF/classes/app.properties")
类加载器将在中查找app.properties

/WEB-INF/classes/WEB-INF/classes /WEB-INF/课程 结论是,要加载位于WEB-INF/classes中的app.properties文件,您需要

AppProperties.class.getResourceAsStream("app.properties")
getResourceAsStream在构成应用程序类路径的所有目录和JAR中查找资源

所以,如果你用

java -cp foo;bar.jar com.baz.Main
如果使用SomeClass.class.getResourceAsStream/blabla/app.properties,类加载器将在foo/blabla下和bar.jar的blablabla目录中查找app.properties文件

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

目录WEB-INF/classes WEB-INF/lib下的所有jar文件 所以,如果你打电话

AppProperties.class.getResourceAsStream("/WEB-INF/classes/app.properties")
类加载器将在中查找app.properties

/WEB-INF/classes/WEB-INF/classes /WEB-INF/课程 结论是,要加载位于WEB-INF/classes中的app.properties文件,您需要

AppProperties.class.getResourceAsStream("app.properties")
试一试

试一试


为什么要投否决票?我的答案是正确的不,不是。ClassLoader.getResourceAsStream需要一个没有前导斜杠的路径。它也不会向OP解释任何事情。当文件名为app.properties时,尝试加载my.properties肯定不会有帮助。@JB Nizet它不希望路径没有引入斜杠检查,或者,这只是OP可以用他需要的任何内容替换文件名的示例。我并没有解释,因为答案很容易在谷歌上找到。如果有什么问题的话,你应该投反对票。几乎这里提出的每个问题都可以在谷歌上找到答案。这不是不解释答案的理由。您给我指出了Class.getResourceAsStream的javadoc,它可以采用带前导斜杠的路径。与ClassLoader.getResourceAsStream不同。为什么要进行向下投票?我的答案是正确的不,不是。ClassLoader.getResourceAsStream需要一个没有前导斜杠的路径。它也不会向OP解释任何事情。当文件名为app.properties时,尝试加载my.properties肯定不会有帮助。@JB Nizet它不希望路径没有引入斜杠检查,或者,这只是OP可以用他需要的任何内容替换文件名的示例。我并没有解释,因为答案很容易在谷歌上找到。如果有什么问题的话,你应该投反对票。几乎这里提出的每个问题都可以在谷歌上找到答案。这不是不解释答案的理由。你给我指出Class.getResource的javadoc
AsStream,它可以采用带前导斜杠的路径。与ClassLoader.getResourceAsStream不同。谢谢/app.properties在WildFly 8.2.1中起作用,在JBoss 4.2.3中也起作用。为什么/WEB-INF/classes/app.properties在JBoss 4.2.3中工作?JBoss 4.2.3是否使用与WildFly 8.2.1不同的类加载器算法?@srh正确。JBoss使用不同的类加载器策略,这与Servlet规范不一致。您可以将其配置为,但默认设置不同。至少过去是这样。我想AS7改变了一切。谢谢/app.properties在WildFly 8.2.1中起作用,在JBoss 4.2.3中也起作用。为什么/WEB-INF/classes/app.properties在JBoss 4.2.3中工作?JBoss 4.2.3是否使用与WildFly 8.2.1不同的类加载器算法?@srh正确。JBoss使用不同的类加载器策略,这与Servlet规范不一致。您可以将其配置为,但默认设置不同。至少过去是这样。我认为AS7改变了一切。谢谢你一如既往的详细回答/app.properties在WildFly 8.2.1中起作用,在JBoss 4.2.3中也起作用。为什么/WEB-INF/classes/app.properties在JBoss 4.2.3中工作?JBoss 4.2.3是否使用与WildFly 8.2.1不同的类加载器算法?webapp的类路径不是JBoss/WildFly的东西。这是一个标准,在Java EE规范中指定。我不知道它为什么在JBoss中工作。我打印了上下文类加载器Thread.currentThread.getContextClassLoader,JBoss 4.2.3给出了输出WebappClassLoader委托:false repositories:/WEB-INF/classes/--->父类加载器:Java.net。FactoryURLClassLoader@e77d77b而WildFly 8.2.1给出了用于模块部署的输出ModuleClassLoader.TestWebReadPropertiesFile.war:main来自服务模块加载器。TestWebReadPropertiesFile.war是部署的应用程序。那是什么意思?不知道。我不知道Wildfly的内部结构。谢谢我只需要向我的经理证明,我们需要更改代码以从JBoss4.2.3升级。对于WildFly 8.2.1,这就是为什么我总是询问Hanks非常详细的答案/app.properties在WildFly 8.2.1中起作用,在JBoss 4.2.3中也起作用。为什么/WEB-INF/classes/app.properties在JBoss 4.2.3中工作?JBoss 4.2.3是否使用与WildFly 8.2.1不同的类加载器算法?webapp的类路径不是JBoss/WildFly的东西。这是一个标准,在Java EE规范中指定。我不知道它为什么在JBoss中工作。我打印了上下文类加载器Thread.currentThread.getContextClassLoader,JBoss 4.2.3给出了输出WebappClassLoader委托:false repositories:/WEB-INF/classes/--->父类加载器:Java.net。FactoryURLClassLoader@e77d77b而WildFly 8.2.1给出了用于模块部署的输出ModuleClassLoader.TestWebReadPropertiesFile.war:main来自服务模块加载器。TestWebReadPropertiesFile.war是部署的应用程序。那是什么意思?不知道。我不知道Wildfly的内部结构。谢谢我只需要向我的经理证明,我们需要更改代码以从JBoss4.2.3升级。到WildFly 8.2.1,这就是我询问的原因