我有一个直接打包为EAR的J2EE应用程序,并部署到在RHEL上运行的Wildfly 10.1.0。EAR包含一个EJB模块、一个WAR模块和一个公共库模块(Comms-1.0-SNAPSHOT. jar),它们与其他依赖项一起驻留在EAR的 /lib文件夹中。在Comms-1.0-SNAPSHOT.jar的根目录中,我有一个属性文件(util.properties),它被打包在同一jar中的实用程序/帮助程序类(即cc.iapps.sprd.通用程序)读取。WAR模块使用实用程序类,但是当它初始化该类时,属性文件无法加载并出现以下错误:
未找到属性文件。:java.ioFileNotFoundException: /content/SpreadServices-ear-1.0-SNAPSHOT.ear/lib/Commons-1.0-SNAPSHOT.jar/util.properties(没有这样的文件或目录)
实用程序类确实已加载,所以我知道Comms-1.0-SNAPSHOT. jar在WAR的类路径中。此外,我已经验证属性文件位于jar文件的根目录,jar文件位于EAR的 /lib文件夹中。
我用来加载属性文件的代码如下:
ClassLoader classLoader = this.getClass().getClassLoader();
File file = new File(classLoader.getResource("util.properties").getFile());
Properties props = new Properties();
props.load(new FileInputStream(file));
奇怪的是,当在我的开发机器上从Eclipse部署到Wildfly 10.1时,该应用程序运行良好。我怀疑这是因为本地版本部署为引用我的开发文件结构的分解EAR。
一般来说,您不应该尝试将类加载器资源读取为java.io. File
对象。除非您碰巧执行分解部署,否则它们不存在于文件系统中。
您提供的解决方案可以归结为:
ClassLoader classLoader = this.getClass().getClassLoader();
Properties props = new Properties();
props.load(classLoader.getResourceAsStream("/util.properties"));
或更恰当地:
ClassLoader classLoader = this.getClass().getClassLoader();
try (InputStream utilsInput = classLoader.getResourceAsStream("/util.properties")) {
Properties props = new Properties();
props.load(utilsInput);
...
}
进行适当的资源管理。
资源名称似乎必须以“/”为前缀,因此将代码更改为以下代码解决了它:
ClassLoader classLoader = this.getClass().getClassLoader();
File file = new File(classLoader.getResource("/util.properties").getFile());
Properties props = new Properties();
props.load(new FileInputStream(file));