WildFly 13域模式下读取类路径properties文件遇空指针求助
如何在WildFly 13域模式下正确读取类路径中的properties文件?
首先得明确你的文件在类路径中的位置:application.properties实际位于WEB-INF/classes/bis/com/test/config/下,而你的App类在bis.com.test.module包中。之前的代码之所以抛出空指针,核心问题是路径写法错误,导致找不到资源流。
下面给你几种靠谱的解决方案,都不需要移动文件:
方法1:利用当前类的相对路径访问
因为App类所在的module包和config包是同级(都在bis.com.test下),可以用相对路径定位到目标文件:
Properties props = new Properties(); // 相对当前类的包路径,向上退一级到test目录,再进入config包 try (InputStream in = getClass().getResourceAsStream("../config/application.properties")) { if (in != null) { props.load(in); String JDBC = props.getProperty("jdbc.connection"); // 这里写你的业务逻辑 } else { throw new FileNotFoundException("application.properties 未在类路径中找到"); } } catch (IOException e) { // 处理IO异常,比如打印日志 e.printStackTrace(); }
方法2:从类路径根目录使用绝对路径访问
类路径的根就是WEB-INF/classes,所以直接从根开始写完整的包路径即可(注意开头的/表示从根目录出发):
Properties props = new Properties(); try (InputStream in = getClass().getResourceAsStream("/bis/com/test/config/application.properties")) { if (in != null) { props.load(in); String JDBC = props.getProperty("jdbc.connection"); } else { throw new FileNotFoundException("application.properties 未在类路径中找到"); } } catch (IOException e) { e.printStackTrace(); }
方法3:使用线程上下文类加载器获取
这种方式不受当前类所在包的影响,直接从类路径根查找资源,适用性更广:
Properties props = new Properties(); try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("bis/com/test/config/application.properties")) { if (in != null) { props.load(in); String JDBC = props.getProperty("jdbc.connection"); } else { throw new FileNotFoundException("application.properties 未在类路径中找到"); } } catch (IOException e) { e.printStackTrace(); }
为什么之前的代码会失败?
- 你用
/application.properties是在类路径根目录找这个文件,但你的文件在bis/com/test/config下,自然找不到,返回null后调用load()就会抛出NPE; - 你写的
/WEB-INF/classes/...是错误的,因为类路径根已经是WEB-INF/classes,不需要再添加这个前缀,路径冗余导致资源定位失败。
内容的提问来源于stack exchange,提问作者Roth
相关产品推荐
相关产品推荐

