SpringBoot项目jar发布获取jar包所在目录路径存放附件及配置

本文探讨了在SpringBoot项目中获取jar包所在目录的不同方法及其在IDEA运行和jar包运行时的差异。第一、二种方式在特定执行环境下可能导致路径错误,而第三、四种方式结果相同。推荐使用第五种方案来确保正确获取运行jar的目录,以避免附件和配置文件的读取问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 //第一种
        File path = new File(ResourceUtils.getURL("classpath:").getPath());
        if(!path.exists()) path = new File("");
        System.out.println(path.getAbsolutePath());
        //第二种
        System.out.println(System.getProperty("user.dir"));
        //第三种
        String path1 = ClassUtils.getDefaultClassLoader().getResource("").getPath();
        System.out.println(URLDecoder.decode(path1, "utf-8"));
        //第四种
        String path2 = ResourceUtils.getURL("classpath:").getPath();
        System.out.println(path2);
        //第五种
        ApplicationHome h = new ApplicationHome(getClass());
        File jarF = h.getSource();
        System.out.println(jarF.getParentFile().toString());

这几种获取项目目录的方式中,其中:

第一种、第二种得到的结果一致

第三种、第四种得到的结果一致

但是,不同的运行方式,他们的结果是有偏差的。下面我们来看下不同情况下依次打印的路径是什么。

先看下直接在idea中运行main方法启动项目时候,打印的路径,显示如下:

再看下打包成jar包中,打印的路径

第一种执行方式

操作方式:打开命令行,目录切换到jar包所在目录,然后执行 jar -jar  启动命令,打印的路径如下:

第二种执行方式

操作方式:打开命令行,直接java -jar  E:/web_pack/bis_exporter-1.0-SANPSHOT.jar,即不切换到jar所在目录,而是直接执行,打印的路径如下:

是不是发现问题了!在这种情况下,第一种和第二种方式打印的路径是不对的,他打印的路径就是当前执行命令时所在的目录。这就很容易造成不必要的bug。

例如:我们在jar的根目录写一个自定义数据配置文件,通过第一种或者第二种方式读取数据,那么使用远程执行jar的方式,就一定会报找不到配置文件的错误。

总结

综上所述,最好使用第五种方案,获取运行jar所在的目录。
 

自己建个工具类把所有附件都放到指定位置

ApplicationHome h = new ApplicationHome(getClass());
File jarF = h.getSource();
System.out.println(jarF.getParentFile().toString());
jar_parent =jarF.getParentFile().toString();
jar_parent+= File.separator+"LQTProject_file"+File.separator;
 System.out.println(jar_parent);

配置下静态资源

#上传文件大小限制
spring.servlet.multipart.max-file-size=30MB
spring.servlet.multipart.max-request-size=300MB

#静态资源配置
#自定义的属性,指定了一个路径,注意要以/结尾
web.upload-path=D:/LQTProject/
#表示所有的访问都经过静态资源路径
spring.mvc.static-path-pattern=/**
#覆盖默认配置,所以需要将默认的也加上否则static、public等这些路径将不能被当作静态资源路径
#在最末尾的file:${web.upload-path}中的file:表示是一个具体的硬盘路径,其他的使用classpath指的是系统环境变量
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值