提问者:小点点

从WAR模块访问嵌入在EAR/libjar中的属性文件


我有一个直接打包为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。


共2个答案

匿名用户

一般来说,您不应该尝试将类加载器资源读取为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));