Maven找不到相对路径 项目内运行正常打jar包后失效问题求助
问题原因
- 你当前使用的
clock/src/main/resources/xxx是本地开发环境的源码文件系统路径,仅在项目源码目录运行时存在。项目打包为jar包后,src/main/resources目录下的文件会被直接放到jar包的classpath根路径下,jar包内不存在/clock/src/main/resources这级目录结构,因此原路径完全失效。 - jar包是压缩归档文件,内部的资源没有独立的文件系统路径,如果你用
File类相关的API读取资源,天生就不支持jar包内的资源访问场景。
解决方法
- 首先修正资源路径,打包后
resources下的Csv目录直接在classpath根路径,路径统一写为/Csv/xxx格式,开头的/代表从classpath根目录开始匹配资源。 - 改造
ReadPath、ReadCsv、ReadCsvL三个方法的读取逻辑,放弃File类API,改用类加载器的getResourceAsStream方法读取jar包内的资源流。
代码示例(以ReadPath改造为例,另外两个CSV读取方法同理修改):
// 改造前的错误写法(仅作对比) // public void ReadPath(String filePath) { // File file = new File(filePath); // // 后续读取逻辑 // } // 改造后的正确写法 import java.io.InputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public void ReadPath(String classpathResourcePath) { // 从当前类的类加载器获取资源流 InputStream inputStream = this.getClass().getResourceAsStream(classpathResourcePath); if (inputStream == null) { throw new IllegalArgumentException("资源不存在:" + classpathResourcePath); } // 用流完成后续读取逻辑,和原逻辑兼容 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); // 其余读取内容的逻辑保持不变即可 }
- 改造
initialize方法内的传参:
@Override public void initialize(URL location, ResourceBundle resources) { ReadPath("/Csv/Path.txt"); ReadCsv("/Csv/MondayA.csv"); ReadCsvL("/Csv/MondayL.csv"); SetTime(); }
- 额外校验:确认你的构建工具(Maven/Gradle)配置没有排除
resources下的Csv目录,默认配置下都会自动将该目录下的文件打入jar包,无需额外配置。
内容的提问来源于stack exchange,提问作者André GT
相关产品推荐
相关产品推荐

