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包所在目录路径内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Mybatis-Plus中update()和updateById()将字段更新为null
本文主要介绍了Mybatis-Plus中update()和updateById()将字段更新为null,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-08-08一文带你深入理解Java AbstractQueuedSynchronizer
在并发编程中,锁是一种保证线程安全的方式,这篇文章主要为大家介绍了AbstractQueuedSynchronizer(AQS)的数据结构及实现原理,感兴趣的小伙伴可以了解一下2023-07-07
最新评论