如何获取运行中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进程:
拿到PID后,用PowerShell查看进程的启动命令行参数:tasklist /fi "imagename eq java.exe"
输出的Get-WmiObject Win32_Process -Filter "ProcessId=<目标进程PID>" | Select-Object CommandLineCommandLine字段里,-jar后面的内容就是Jar包的路径。
二、从Jar包自身代码中获取路径
如果是你自己开发的Jar包,想在运行时获取自身的路径,可以用这两种代码实现:
- 利用类的保护域获取代码源路径:
注意:如果在IDE中直接运行(未打包成Jar),这个方法会返回编译后的class文件路径,只有打包成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); } } - 从JVM启动参数中提取Jar包路径:
这个方法适合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); } } }java -jar命令启动的场景,直接从JVM启动参数里提取路径。
三、一些注意事项
- 如果进程是通过
java -cp指定类路径启动的(不是-jar),可以看jps -lv输出里的-cp参数后面的路径列表,从中找到对应的Jar包。 - 对于Linux容器环境,需要进入容器内部执行命令,或者用
docker exec来运行jps/ps等命令排查。
内容的提问来源于stack exchange,提问作者Bruno Fauth
相关产品推荐
相关产品推荐

