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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:48:10