You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取运行中Jar包的文件路径及确定JVM进程运行的Jar包?

如何获取运行中Jar包的文件路径?

刚好之前折腾过类似的需求,给你整理几个实用的方法——不管是从外部排查JVM进程对应的Jar包,还是从Jar包自身代码里获取路径都能用:

一、从外部进程层面定位JVM进程对应的Jar包

Linux/macOS 环境

  • 用jps命令是最快捷的方式,它能直接列出所有JVM进程及关联的Jar包信息:
    jps -lv
    
    解释:-l参数会显示主类全限定名或Jar包的完整路径,-v还能附带JVM启动参数,一眼就能找到目标进程对应的Jar包位置。
  • 如果jps没找到目标进程,用ps配合grep筛选Java进程:
    ps aux | grep java
    
    看输出里的-jar参数后面的字符串,就是Jar包的路径。
  • 还可以用lsof查看进程打开的文件,精准定位Jar包:
    lsof -p <目标进程PID> | grep .jar
    
    把<目标进程PID>换成你要找的JVM进程ID,就能看到该进程加载的所有Jar包路径。

Windows 环境

  • 同样可以用jps -lv(前提是Java环境变量配置正确),在命令提示符或PowerShell里执行,效果和Linux一致。
  • 用tasklist先筛选出Java进程:
    tasklist /fi "imagename eq java.exe"
    
    拿到PID后,用PowerShell查看进程的启动命令行参数:
    Get-WmiObject Win32_Process -Filter "ProcessId=<目标进程PID>" | Select-Object CommandLine
    
    输出的CommandLine字段里,-jar后面的内容就是Jar包的路径。

二、从Jar包自身代码中获取路径

如果是你自己开发的Jar包,想在运行时获取自身的路径,可以用这两种代码实现:

  • 利用类的保护域获取代码源路径:
    import java.net.URL;
    import java.net.URLDecoder;
    import java.nio.charset.StandardCharsets;
    
    public class JarPathDemo {
        public static void main(String[] args) throws Exception {
            URL jarUrl = JarPathDemo.class.getProtectionDomain().getCodeSource().getLocation();
            String jarPath = jarUrl.getPath();
            // 处理URL编码问题(比如空格会被转成%20)
            jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8.name());
            System.out.println("当前Jar包路径:" + jarPath);
        }
    }
    
    注意:如果在IDE中直接运行(未打包成Jar),这个方法会返回编译后的class文件路径,只有打包成Jar运行时才会返回Jar包路径。
  • 从JVM启动参数中提取Jar包路径:
    import java.lang.management.ManagementFactory;
    import java.lang.management.RuntimeMXBean;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class JarPathFromArgs {
        public static void main(String[] args) {
            RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
            String jvmArgs = runtimeBean.getInputArguments().toString();
            // 匹配-jar后面的Jar包路径
            Pattern pattern = Pattern.compile("-jar\\s+(\\S+)");
            Matcher matcher = pattern.matcher(jvmArgs);
            if (matcher.find()) {
                String jarPath = matcher.group(1);
                System.out.println("Jar包路径:" + jarPath);
            }
        }
    }
    
    这个方法适合Jar包通过java -jar命令启动的场景,直接从JVM启动参数里提取路径。

三、一些注意事项

  • 如果进程是通过java -cp指定类路径启动的(不是-jar),可以看jps -lv输出里的-cp参数后面的路径列表,从中找到对应的Jar包。
  • 对于Linux容器环境,需要进入容器内部执行命令,或者用docker exec来运行jps/ps等命令排查。

内容的提问来源于stack exchange,提问作者Bruno Fauth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:12:05