You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用相对路径读取.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,提示找不到相对路径指向的文件。


问题原因
  1. 相对路径基准不一致:
    • 本地运行main类时,相对路径的基准是项目根目录,因此src/main/config/...能匹配到文件。
    • Tomcat部署后,Web应用的当前工作目录是Tomcat的bin目录(而非你的项目根目录),此时该相对路径在Tomcat环境中不存在,必然找不到文件。
  2. Maven打包后文件结构变更:
    开发时的src/main/config目录不会被Maven默认打包到war包的对应路径,即使手动配置打包,war包解压后的结构也和开发环境完全不同,原相对路径自然失效。
解决方法

方法1:类路径加载(推荐)

这是Java Web应用读取配置文件的标准做法,跨环境兼容性最好:

  1. 调整文件位置:将application.properties移至src/main/resources目录(Maven默认会把该目录下的文件打包到类路径根目录),如需分类可创建子目录如src/main/resources/config/local。
  2. 修改读取代码:通过类加载器获取输入流:
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下):

  1. 调整文件位置:将application.properties移至src/main/webapp/WEB-INF/config/local目录。
  2. 修改读取代码:
// 获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:00:08