Java部署新手求助:JSON文件读取及WAR打包缺失问题
嘿,作为Java部署领域的新手,遇到这俩问题真的太正常了——我刚入门的时候也踩过一模一样的坑!咱们一步步把它们搞定:
问题1:相对路径使用FileReader找不到文件
你遇到的FileNotFoundException,核心原因是**FileReader的相对路径是相对于JVM的启动目录**,而不是你的项目代码目录。在Tomcat环境下,这个启动目录是Tomcat安装目录下的bin文件夹,所以你写new FileReader("file.json")时,程序会去Tomcat的bin目录找这个文件,自然找不到啦!
正确的解决方式:用类加载器读取Classpath资源
Web应用里,要读取配置文件(比如JSON),最佳实践是通过类加载器从classpath中读取,不管是本地开发还是服务器部署,路径逻辑都是一致的,不用改来改去。
具体步骤:
把你的
file.json放到项目的资源目录里:- 如果是Maven/Gradle项目,放到
src/main/resources目录下; - 如果是普通Web项目,放到
WEB-INF/classes目录下(本地开发时IDE会自动把这里的文件加载到classpath)。
- 如果是Maven/Gradle项目,放到
用以下代码替换原来的
FileReader调用:
// 用类加载器获取资源输入流 try (InputStream jsonInputStream = getClass().getResourceAsStream("/file.json"); // 把输入流转换成Reader Reader reader = new InputStreamReader(jsonInputStream)) { // 这里写你的JSON解析逻辑,比如用Jackson、Gson等库 // 示例(假设用Gson): // Gson gson = new Gson(); // YourDataClass data = gson.fromJson(reader, YourDataClass.class); } catch (IOException e) { // 处理异常,比如打印日志或提示用户 e.printStackTrace(); }
为什么这样有效?
- 本地开发时,资源目录的文件会被编译/复制到项目的
target/classes(Maven)或对应输出目录,类加载器能直接找到; - 打包成war后,资源目录的文件会被自动打包到
WEB-INF/classes目录下,服务器运行时类加载器同样能访问到。
注意:路径开头的
/表示classpath的根目录,不要漏掉哦!如果你的JSON文件在资源目录的子文件夹里,比如resources/config/file.json,路径就写成/config/file.json。
问题2:打包成war后JSON文件缺失
这个问题和上面的原因是联动的——如果你的JSON文件没放在资源目录(比如直接放在项目根目录或src/main/java下),Maven/Gradle或者IDE的打包工具默认不会把这些文件包含到war包里,所以部署后自然找不到。
解决步骤:
- 把JSON文件移动到
src/main/resources(Maven)或WEB-INF/classes(普通Web项目); - 重新打包war文件,此时文件会被自动包含到
WEB-INF/classes下; - 用上面提到的类加载器方式读取文件,就不会再出现缺失的问题了。
总结一下
别再用FileReader直接读相对路径啦,换成类加载器读取classpath资源,既解决了路径问题,又能保证打包后文件不丢失,一次配置,本地和服务器都能用!
内容的提问来源于stack exchange,提问作者Bhavesh Shah

