Spring Boot中application.properties配置路径跨目录执行Jar异常求助
解决Spring Boot中仓库路径随执行目录变化的问题
问题根源
你配置的path.repository=/repository是相对于当前执行java -jar命令的工作目录,而非Jar文件所在的目录。所以在spring/project下执行命令时,工作目录是spring/project,路径指向spring/project/repository;在spring目录执行时,工作目录变成spring,路径就指向spring/repository,导致找不到目标目录。
解决方案
配置相对Jar文件的路径(推荐)
通过代码获取Jar所在目录,再拼接仓库路径,保证无论在哪执行命令,路径都指向Jar所在目录下的repository:@Configuration public class RepositoryConfig { @Value("${path.repository:repository}") private String repoPath; @Bean public File repositoryDir() throws URISyntaxException { // 获取Jar文件的绝对路径 File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); // 获取Jar所在的父目录 File jarParentDir = jarFile.getParentFile(); // 拼接仓库路径 File repositoryDir = new File(jarParentDir, repoPath); // 自动创建目录(如果不存在) if (!repositoryDir.exists()) { repositoryDir.mkdirs(); } return repositoryDir; } }同时修改
application.properties:path.repository=repository去掉开头的
/,表示相对Jar所在目录的子目录。使用绝对路径
直接在配置中写死仓库的绝对路径,比如:path.repository=/spring/project/repository这种方式简单但不灵活,更换部署环境时需要手动修改配置。
通过启动参数传递路径
启动Jar时动态指定路径,无需修改配置文件:java -jar project/target/SNAPSHOT.jar --path.repository=/spring/project/repository也可以通过系统环境变量传递,Spring会自动识别大写加下划线的环境变量(比如
PATH_REPOSITORY=/spring/project/repository)。固定到classpath(仅适用于静态只读场景)
如果仓库不需要外部写入,可以将repository放到src/main/resources下,用classpath:repository访问,但这种方式只适合静态资源,不适合需要动态生成文件的场景。
内容的提问来源于stack exchange,提问作者fonkys
相关产品推荐
相关产品推荐

