如何在web.xml中为.ini文件指定正确的相对文件路径
问题原因
直接通过java.io.File读取web.xml中配置的/WebApp.ini路径时,程序解析的是服务器操作系统根目录下的文件,不是war包内部的web资源路径。WAS不会把war内的web根路径自动映射成本地磁盘路径,所以会抛出文件找不到异常;手动填写war解压后的磁盘绝对路径能运行,本质是绕开了web资源路径和本地文件系统路径的差异,属于硬编码写法,迁移、重新部署时都会失效。
正确配置与实现
- 先确定文件存放位置,二选一即可:
- 放在web应用根目录(与WEB-INF文件夹同级)
- 放在
WEB-INF/classes目录下(即类加载根路径)
- web.xml中不需要配置磁盘绝对路径,按资源位置写相对路径即可:
如果文件存在web根目录,配置保持如下写法:
如果文件存在<context-param> <description>应用初始化配置文件路径</description> <param-name>InitFileName</param-name> <param-value>/WebApp.ini</param-value> </context-param>WEB-INF/classes目录下,配置直接写文件名:<context-param> <description>应用初始化配置文件路径</description> <param-name>InitFileName</param-name> <param-value>WebApp.ini</param-value> </context-param> - 替换文件读取逻辑,不要用
new File(路径)的方式加载,用Web容器或类加载器提供的资源读取接口,不需要关心war包实际解压到磁盘的位置,适配所有Java EE容器包括WAS:
对应web根目录存放的读取代码:
对应类路径存放的读取代码:// 从Servlet上下文获取配置的路径值 String initFile = getServletContext().getInitParameter("InitFileName"); // 直接获取web资源的输入流 InputStream configStream = getServletContext().getResourceAsStream(initFile); // 后续按业务逻辑读取流内容即可,比如加载为Properties配置String initFile = getServletContext().getInitParameter("InitFileName"); // 通过上下文类加载器读取类路径下的资源 InputStream configStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(initFile);
注意:绝对不要在配置里硬编码war包解压后的磁盘绝对路径,WAS重启、应用重新部署、集群节点路径差异、容器版本升级都可能导致解压路径变化,引发功能故障。
内容的提问来源于stack exchange,提问作者apifeez
相关产品推荐
相关产品推荐

