服务器获取Jar包运行目录实现方式

 更新时间:2025年11月18日 09:36:19   作者:chen_179  
本文介绍了两种获取Java应用程序运行目录的方法:使用`System.getProperty("user.dir")`和通过`ProtectionDomain`及`CodeSource`类,前者简单直接,但返回的是当前工作目录;后者更为复杂,但能准确获取JAR文件的路径,选择哪种方法取决于具体需求

使用JAVA标准库获取运行在服务器上 Jar包所在目录

1.System.getProperty("user.dir")

可直接获取Jar包启动运行的目录

(/usr/local/test/app.jar —> /usr/local/test)

2.与方法1不同

获取的是jar包真实运行的路径(!/BOOT-INF/classes!/)

import java.io.File;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
  
    public static String getJarPath(Class<?> clazz) {
        ProtectionDomain protectionDomain = clazz.getProtectionDomain();
        CodeSource codeSource = protectionDomain.getCodeSource();
        URL location = codeSource.getLocation();

        // 服务器:
        // file:/usr/local/test/api/app-api-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/
        String jarPath = location.getPath();
        // 截取有效路径:
        // /usr/local/test/api/app-api-0.0.1-SNAPSHOT.jar
        String reallyPath = jarPath.substring(jarPath.indexOf(":") + 1, jarPath.indexOf("!"));
        // 获取jar包文件的父目录
        File jarFile = new File(reallyPath);
        if (jarFile != null) {
        	///usr/local/test/api
            return jarFile.getParent();
        }
        return null;
    }

3.小结

ProtectionDomain 和 CodeSource 类的主要作用是获取 当前运行应用程序 的 JAR 包路径。

与直接使用 System.getProperty(“user.dir”) 方法相比,两者有一些区别和适用场景。

System.getProperty(“user.dir”):

  • 优点:简单、直接,无需额外依赖
  • 缺点:它返回的是当前工作目录(即启动 Java 进程所在的目录),而不一定是正在运行的 JAR 包所在的路径。如果应用程序是作为 JAR 文件运行的,那么这个方法将会返回启动 JAR 的目录,而不是 JAR 文件本身的路径。

ProtectionDomain 和 CodeSource:

  • 优点:可以获取正在运行的 JAR 包的路径,适用于以 JAR 文件形式运行的应用程序
  • 缺点:相对比较复杂,需要使用 Java 标准库的类和方法,可能涉及到一些异常处理

所以,选择哪种方法取决于你的具体需求和应用程序的运行方式。

如果你只需要获取当前工作目录或启动 JAR 的目录,且不关心 JAR 文件所在路径,那么使用 System.getProperty(“user.dir”) 方法是更简单和直接的选择。

但如果你需要获取正在运行的 JAR 文件的路径,并且应用程序是作为 JAR 文件运行的,那么使用 ProtectionDomain 和 CodeSource 类可以提供准确的 JAR 包路径信息。

最后

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java配置文件取值的多种方式总结

    java配置文件取值的多种方式总结

    这篇文章主要为大家详细介绍了java配置文件取值的多种方式,包括一般项目,国际化项目,springboot项目,文中的示例代码讲解详细,需要的可以参考下
    2023-11-11
  • SpringBoot中Mybatis + Druid 数据访问的详细过程

    SpringBoot中Mybatis + Druid 数据访问的详细过程

    Spring Boot 底层都是采用 SpringData 的方式进行统一处理各种数据库,SpringData也是Spring中与SpringBoot、SpringCloud 等齐名的知名项目,下面看下SpringBoot Mybatis Druid数据访问的详细过程,感兴趣的朋友一起看看吧
    2021-11-11
  • Java中instanceof关键字实例讲解

    Java中instanceof关键字实例讲解

    大家好,本篇文章主要讲的是Java中instanceof关键字实例讲解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • java中List分页的几种方法介绍

    java中List分页的几种方法介绍

    大家好,本篇文章主要讲的是java中List分页的几种方法介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 使用IDEA创建Java Web项目并部署访问的图文教程

    使用IDEA创建Java Web项目并部署访问的图文教程

    本文通过图文并茂的形式给大家介绍了使用IDEA创建Java Web项目并部署访问的教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • SpringBoot设置接口超时时间的方法

    SpringBoot设置接口超时时间的方法

    这篇文章主要介绍了SpringBoot设置接口超时时间的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Spring源码解析之编程式事务

    Spring源码解析之编程式事务

    今天给大家带来的是关于Java Spring的相关知识,文章围绕着Spring编程式事务展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • java 单例模式(懒汉式与饿汉式)

    java 单例模式(懒汉式与饿汉式)

    这篇文章主要介绍了java 单例模式的相关资料,这里对懒汉式与饿汉式都做了实例介绍,需要的朋友可以参考下
    2017-07-07
  • IDEA部署Tomcat的超详细图文教程

    IDEA部署Tomcat的超详细图文教程

    最近迫于无奈从我哪破旧的Eclipse转换到了IDEA,然后就是超多的不习惯,下面这篇文章主要给大家介绍了关于IDEA部署Tomcat的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • swagger如何返回map字段注释

    swagger如何返回map字段注释

    这篇文章主要介绍了swagger如何返回map字段注释的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论