SpringBoot项目中jar发布获取jar包所在目录路径的最佳方法

 更新时间:2022年07月24日 09:57:02   作者:m0_66557301  
在开发过程中,我们经常要遇到上传图片、word、pdf等功能,但是当我们把项目打包发布到服务器上时,对应的很多存储路径的方法就会失效,下面这篇文章主要给大家介绍了关于SpringBoot项目中jar发布获取jar包所在目录路径的相关资料

 示例代码:

        //第一种
        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的方式,就一定会报找不到配置文件的错误。

补充:springboot获取运行Jar包的目录

//linux和windows下通用
private String getJarFilePath() {
    ApplicationHome home = new ApplicationHome(getClass());
    File jarFile = home.getSource();
    return jarFile.getParentFile().toString();
}

总结

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

到此这篇关于SpringBoot项目中jar发布获取jar包所在目录路径的文章就介绍到这了,更多相关SpringBoot获取jar包所在目录路径内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 中volatile和lock原理分析

    java 中volatile和lock原理分析

    这篇文章主要介绍了java 中volatile和lock原理分析的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java中获取文件大小的详解及实例代码

    Java中获取文件大小的详解及实例代码

    这篇文章主要介绍了Java中获取文件大小的详解及实例代码的相关资料,一种是使用File的length()方法,另外一种是使用FileInputStream的available()方法,这里就说下如何使用需要的朋友可以参考下
    2016-12-12
  • Java创建多线程异步执行实现代码解析

    Java创建多线程异步执行实现代码解析

    这篇文章主要介绍了Java创建多线程异步执行实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SPRINGBOOT读取PROPERTIES配置文件数据过程详解

    SPRINGBOOT读取PROPERTIES配置文件数据过程详解

    这篇文章主要介绍了SPRINGBOOT读取PROPERTIES配置文件数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 详解java整合solr5.0之solrj的使用

    详解java整合solr5.0之solrj的使用

    本篇文章主要介绍了详解java整合solr5.0之solrj的使用 ,具有一定的参考价值,有兴趣的可以了解下
    2017-06-06
  • Java访问Hadoop分布式文件系统HDFS的配置说明

    Java访问Hadoop分布式文件系统HDFS的配置说明

    Hadoop的能提供高吞吐量的数据访问,是集群式服务器的上的数据操作利器,这里就来为大家分享Java访问Hadoop分布式文件系统HDFS的配置说明:
    2016-06-06
  • Java中的Semaphore信号量使用解析

    Java中的Semaphore信号量使用解析

    这篇文章主要介绍了Java中的Semaphore信号量使用解析,Semaphore 通常我们叫它信号量,可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源,需要的朋友可以参考下
    2023-11-11
  • 聊聊SpringBoot整合Nacos自动刷新配置的问题

    聊聊SpringBoot整合Nacos自动刷新配置的问题

    Nacos作为SpringBoot服务的注册中心和配置中心,本例将在配置文件中配置一个 cml.age=100 的配置项,程序中编写一个方法读取配置文件,并通过 Get--->/test/age 接口提供给浏览器访问,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • Spring Boot中的属性绑定的实现

    Spring Boot中的属性绑定的实现

    这篇文章主要介绍了Spring Boot中的属性绑定的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • B/S与C/S架构的区别介绍

    B/S与C/S架构的区别介绍

    本文详细讲解了B/S与C/S架构的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12

最新评论