Java Maven项目中相对路径失效但绝对路径可用的问题
解决Java中相对路径读取资源文件失效的问题
问题原因
你用FileReader读取文件时,相对路径是基于JVM启动的当前工作目录,而非源码文件所在的目录。比如在IDE中运行时,工作目录通常是项目根目录,但直接写"data.csv"或"src/main/resources/data.csv"的话,一旦项目打包成Jar包,resources目录下的文件会被嵌入Jar内部,此时FileReader无法访问Jar中的资源,绝对路径自然也就只能在特定环境下生效。
正确解决方案(推荐)
由于你的data.csv放在src/main/resources目录下,这是Maven/Gradle项目的标准资源目录,编译后该目录下的文件会被放到Classpath的根目录中。因此应该用ClassLoader读取Classpath资源,这种方式在IDE运行和Jar包运行时都能正常工作。
修改后的Utils.java代码:
package org.example; import org.example.model.Stats; import java.io.*; import java.util.ArrayList; import java.util.List; public class Utils { // 直接使用Classpath根目录下的资源名,无需绝对路径 private static final String RESOURCE_NAME = "data.csv"; public static List<Stats> readData() { List<Stats> statsList = new ArrayList<>(); // 通过ClassLoader获取资源输入流 try (BufferedReader br = new BufferedReader( new InputStreamReader(Utils.class.getClassLoader().getResourceAsStream(RESOURCE_NAME))) ) { if (br == null) { System.out.println("Error: 未找到资源文件 " + RESOURCE_NAME); return statsList; } String line; while ((line = br.readLine()) != null) { String[] fields = line.split(","); Stats stats = new Stats(); stats.setName(fields[0]); stats.setAddress(fields[1]); stats.setContact(fields[2]); stats.setAbout(fields[3]); statsList.add(stats); } } catch (IOException e) { System.out.println("读取文件出错: " + e.getMessage()); } return statsList; } }
临时调试方案(仅IDE中可用,不推荐用于生产)
如果只是在IDE中临时测试相对路径,路径需要相对于项目根目录,即:
private static final String FILE_PATH = "src/main/resources/data.csv";
但这种方式在打包成Jar后会彻底失效,因为Jar包内不存在这个文件系统路径,因此不推荐使用。
内容的提问来源于stack exchange,提问作者Ranga chimalgi
相关产品推荐
相关产品推荐

