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

Maven找不到相对路径 项目内运行正常打jar包后失效问题求助

问题原因
  • 你当前使用的clock/src/main/resources/xxx是本地开发环境的源码文件系统路径,仅在项目源码目录运行时存在。项目打包为jar包后,src/main/resources目录下的文件会被直接放到jar包的classpath根路径下,jar包内不存在/clock/src/main/resources这级目录结构,因此原路径完全失效。
  • jar包是压缩归档文件,内部的资源没有独立的文件系统路径,如果你用File类相关的API读取资源,天生就不支持jar包内的资源访问场景。
解决方法
  1. 首先修正资源路径,打包后resources下的Csv目录直接在classpath根路径,路径统一写为/Csv/xxx格式,开头的/代表从classpath根目录开始匹配资源。
  2. 改造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));
    // 其余读取内容的逻辑保持不变即可
}
  1. 改造initialize方法内的传参:
@Override
public void initialize(URL location, ResourceBundle resources) {
    ReadPath("/Csv/Path.txt");
    ReadCsv("/Csv/MondayA.csv");
    ReadCsvL("/Csv/MondayL.csv");
    SetTime();
}
  1. 额外校验:确认你的构建工具(Maven/Gradle)配置没有排除resources下的Csv目录,默认配置下都会自动将该目录下的文件打入jar包,无需额外配置。

内容的提问来源于stack exchange,提问作者André GT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:30:03