如何在Java中获取启动应用的.jar程序名称?
获取Java程序的Jar文件名
我明白你想要拿到启动程序时对应的Jar文件名,这个需求其实挺常见的,下面给你几个可行的实现方案,你可以根据自己的场景选择:
方法一:通过主类的CodeSource获取
这是最常用的方式,核心思路是从你的主类(比如Main类)的代码源信息里提取Jar路径,再解析出文件名。
示例代码:
import java.io.File; import java.net.URL; public class Main { public static void main(String[] args) { try { // 获取主类的CodeSource URL codeSource = Main.class.getProtectionDomain().getCodeSource().getLocation(); // 转换为文件路径 String jarPath = codeSource.getFile(); // 解码URL编码的特殊字符(比如空格会被转成%20) jarPath = java.net.URLDecoder.decode(jarPath, "UTF-8"); // 从路径中提取Jar文件名 File jarFile = new File(jarPath); String jarFileName = jarFile.getName(); System.out.println("当前运行的Jar文件名:" + jarFileName); } catch (Exception e) { // 处理异常:比如在IDE中运行时,不是Jar包,这时候会抛出异常 System.err.println("无法获取Jar文件名,可能不是通过Jar包运行:" + e.getMessage()); } } }
注意点:
- 如果是在IDE(比如IntelliJ、Eclipse)中直接运行,而不是打包成Jar,
getCodeSource()可能返回null或者指向编译后的class文件目录,这时候需要加异常处理,避免程序崩溃。 - 路径中的特殊字符(比如空格)会被URL编码,所以需要用
URLDecoder解码,否则文件名会显示异常。
方法二:通过系统属性获取(适用于特定启动方式)
如果你的Jar是通过java -jar your-app.jar启动的,也可以尝试读取系统属性sun.java.command,这个属性会保存启动时的命令行参数,从中提取Jar文件名:
示例代码:
public class Main { public static void main(String[] args) { String command = System.getProperty("sun.java.command"); if (command != null) { // 分割命令行参数,找到Jar文件名 String[] parts = command.split(" "); for (String part : parts) { if (part.endsWith(".jar")) { System.out.println("当前运行的Jar文件名:" + new File(part).getName()); break; } } } else { System.err.println("无法获取命令行信息"); } } }
注意点:
- 这个属性是Sun/Oracle JDK的私有属性,虽然大部分JVM都支持,但不是标准属性,兼容性可能不如方法一。
- 如果启动命令里有空格或者其他参数,需要做好分割处理,比如如果Jar路径包含空格,
split(" ")可能会分割错误,这时候需要更复杂的解析逻辑。
方法三:处理可执行Jar(比如通过jlink打包的镜像)
如果你的程序是通过jlink打包成模块化的可执行镜像,上面的方法可能不适用,这时候可以通过System.getProperty("java.launcher.path")获取启动器路径,再处理:
示例代码:
public class Main { public static void main(String[] args) { String launcherPath = System.getProperty("java.launcher.path"); if (launcherPath != null) { File launcherFile = new File(launcherPath); System.out.println("启动器文件名:" + launcherFile.getName()); } else { System.err.println("无法获取启动器信息"); } } }
总结
优先推荐方法一,因为它是基于Java标准API,兼容性最好,能覆盖绝大多数Jar运行场景。如果是特殊的启动方式,再考虑后面的方法。记得在代码中加入异常处理,应对非Jar运行的情况。
内容的提问来源于stack exchange,提问作者Amateur Coder
相关产品推荐
相关产品推荐

