我的电脑的操作系统是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中属性文件的正确方法是什么?
答案 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的类路径的是
所以,如果你打电话
bar.jar
类加载器将在
中查找app.propertiesAppProperties.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)
---------------------------