使用相对路径读取.properties文件在Tomcat部署后返回null求助
问题描述
我尝试从与.properties文件不在同一目录的类中读取该文件:用带main方法的testLogin.java测试时,绝对路径和相对路径都能成功读取;但在Servlet类login.java中,Tomcat部署后用绝对路径能正常运行,用相对路径却返回null。项目基于Maven构建,相关信息如下:
核心代码(login.java)
public void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ Properties properties = new Properties(); // 使用相对路径(Tomcat部署后报错) try(InputStream is = new FileInputStream("src/main/config/local/application.properties")){ // Tomcat部署后返回null,但main类中运行正常 properties.load(is); System.out.println(properties.getProperty("enviroment")); }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } // 使用绝对路径(正常运行) try(InputStream is = new FileInputStream("C:\\Usuario\\Documents\\project-web\\src\\main\\config\\local\\application.properties")){ // 运行正常 properties.load(is); System.out.println(properties.getProperty("enviroment")); // 输出localhost }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } }
项目结构
Maven项目结构,application.properties存放于src/main/config/local目录,Servlet类位于src/main/java下对应包中。
部署后错误
Tomcat控制台抛出FileNotFoundException,提示找不到相对路径指向的文件。
问题原因
- 相对路径基准不一致:
- 本地运行main类时,相对路径的基准是项目根目录,因此
src/main/config/...能匹配到文件。 - Tomcat部署后,Web应用的当前工作目录是Tomcat的bin目录(而非你的项目根目录),此时该相对路径在Tomcat环境中不存在,必然找不到文件。
- 本地运行main类时,相对路径的基准是项目根目录,因此
- Maven打包后文件结构变更:
开发时的src/main/config目录不会被Maven默认打包到war包的对应路径,即使手动配置打包,war包解压后的结构也和开发环境完全不同,原相对路径自然失效。
解决方法
方法1:类路径加载(推荐)
这是Java Web应用读取配置文件的标准做法,跨环境兼容性最好:
- 调整文件位置:将
application.properties移至src/main/resources目录(Maven默认会把该目录下的文件打包到类路径根目录),如需分类可创建子目录如src/main/resources/config/local。 - 修改读取代码:通过类加载器获取输入流:
try(InputStream is = getClass().getClassLoader().getResourceAsStream("config/local/application.properties")){ if(is == null){ throw new FileNotFoundException("配置文件未找到"); } properties.load(is); System.out.println(properties.getProperty("enviroment")); }catch(IOException e){ e.printStackTrace(); }
方法2:通过ServletContext获取Web应用真实路径
若需将配置文件放在非类路径位置(如WEB-INF下):
- 调整文件位置:将
application.properties移至src/main/webapp/WEB-INF/config/local目录。 - 修改读取代码:
// 获取Web应用根目录的真实磁盘路径 String realPath = getServletContext().getRealPath("/WEB-INF/config/local/application.properties"); try(InputStream is = new FileInputStream(realPath)){ properties.load(is); System.out.println(properties.getProperty("enviroment")); }catch(IOException e){ e.printStackTrace(); }
注意事项
- 绝对路径禁止硬编码:不同环境(开发/测试/生产)的绝对路径不同,硬编码会导致跨环境部署失效。
- 优先使用类加载器方式:无需关心文件的实际磁盘路径,依赖类路径即可完成读取,适配所有运行环境。
内容的提问来源于stack exchange,提问作者frann
相关产品推荐
相关产品推荐

