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包所在目录路径内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot打jar包之后下载文件的路径问题

    错误信息 能看到下载的路径中包含了jar包,wlaqWeb-0.0.1-SNAPSHOT.jar! java.io.FileNotFoundException: file:\C:\Users\PENGXIN\Desktop\网络安全\jars\wlaqWeb-0.0.1-SNAPSHOT.jar!\BOOT-INF\classes!\static\securityParameter\template\网络安全台账(模板).xlsx (文件名.目录名或卷标语法不正确.) at java.io.Fi

  • SpringBoot项目jar发布后如何获取jar包所在目录路径

    目录 SpringBoot项目jar发布获取jar包所在目录路径 SpringBoot打可执行jar运行时输出文件路径问题 SpringBoot项目jar发布获取jar包所在目录路径 ApplicationHome ah = new ApplicationHome(getClass()); File file = ah.getSource(); System.out.println(file.getParentFile().toString()); 说明: 该种方法获取jar包所在路径好处,会根

  • 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")); //

  • SpringBoot项目没有把依赖的jar包一起打包的问题解决

    这篇文章主要介绍了SpringBoot项目没有把依赖的jar包一起打包的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一般未一起打包是因为pom不是继承自spring-boot-starter-parent导致的需要在pom.xml文件写入以下配置 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>

  • 服务器使用Nginx部署Springboot项目的详细教程(jar包)

    1,将java项目打成jar包 这里我用到的是maven工具 这里有两个项目,打包完成后一个为demo.jar,另一个为jst.jar 2.准备工具 1.服务器 2.域名(注:经过备案) 3.Xshell用于连接服务器 4.WinScp(注:视图工具,用于传输jar) 3.将jar包传入服务器 直接拖动即可 3.使用Xshell运行jar包 注:(服务器的java环境以及maven环境,各位请自行配置,这里不做描述.) cd到jar包路径下执行:nohup java -jar demo.jar

  • 浅谈springboot项目中定时任务如何优雅退出

    在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生效. 启动类 启动类上我们获取到相应的上下文,捕捉相应命令.在这里插入代码片 @SpringBootApplication /**指定mapper对应包的路径*/ @MapperScan("com.youlanw.kz.dao") /**开启计划任务*/ @EnableScheduling

  • 在SpringBoot项目中的使用Swagger的方法示例

    一. 首先Swagger是什么? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步.Swagger官方API文档:https://swagger.io/ 作用:   1. 接口的文档在线自动生成.   2. 功能测试. Swagger的主见介绍:    Swagger Codegen: 通过Codegen 可

  • SpringBoot项目中如何实现MySQL读写分离详解

    目录 1.MySQL主从复制 1.1.介绍 二进制日志: MySQL复制过程分成三步: 1.2.主从库搭建 1.2.1.主库配置 1.2.2.从库配置 1.3.坑位介绍 1.3.1.UUID报错 1.3.2.server_id报错 1.3.3.同步异常解决 操作不规范,亲人两行泪…… 2.项目中实现 2.1.ShardingJDBC 2.2.依赖导入 2.3.配置文件 2.4.测试跑路 总结 1.MySQL主从复制 但我们仔细观察我们会发现,当我们的项目都是用的单体数据库时,那么就可能会存在如下

  • SpringBoot项目中使用redis缓存的方法步骤

    本文介绍了SpringBoot项目中使用redis缓存的方法步骤,分享给大家,具体如下: Spring Data Redis为我们封装了Redis客户端的各种操作,简化使用. - 当Redis当做数据库或者消息队列来操作时,我们一般使用RedisTemplate来操作 - 当Redis作为缓存使用时,我们可以将它作为Spring Cache的实现,直接通过注解使用 1.概述 在应用中有效的利用redis缓存可以很好的提升系统性能,特别是对于查询操作,可以有效的减少数据库压力. 具体的代码参照该

  • 在SpringBoot项目中利用maven的generate插件

    使用maven 插件 generate生成MyBatis相关文件 在项目中增加 maven 依赖 - mybatis-spring-boot-starter - mysql-connector-java - mybatis-generator-maven-plugin 插件 自动读取 resources 下的generatorConfig.xml 文件 <?xml version="1.0" encoding="UTF-8"?> <project

  • SpringBoot项目如何打可执行war包

    最近做了一个Springboot项目,但是最后需要打成WAR包在容器中部署,下面就简单记录一下. 1.修改pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://ma

随机推荐