如何获取Java程序的名称?

12

我正在创建一个应用程序,可以是 .exe.jar,我需要知道它是哪种类型。有人知道如何在Java中获取正在运行的程序的文件名/扩展名吗?我可以获取程序运行的路径,但无法获取名称。


问题不清楚。进程A是通过启动器(.exe或.jar)启动的,您想在进程A中查找启动器的详细信息还是在其他进程B中查找?哪个是基于Java的?进程A还是进程B? - Amol Katdare
3个回答

5
将“程序名称”作为属性通过“-D”命令行开关传递给您的程序,如下所示。
java -Dprogram.name=myApp.jar -jar myApp.jar

在您的代码中这样读取

if ("myApp.jar".equals(System.getProperty("program.name"))) {
   // perform appropriate actions...
}

谢谢,我已经在上面评论了你的答案! - Andy

5
实际运行JAR文件的程序是java.exe。我建议您从完全不同的角度解决问题,并设置一个系统属性,供程序查询。或者您可以让它和JAR清单指定不同的主类。

你好,现在我明白了 - 感谢您的回复。我会尝试您建议的方法,但我会想办法绕过去! - Andy

0

下面这段代码应该可以解决问题:

try {
    Class cls = Class.forName(getClass().getCanonicalName());
    ClassLoader cLoader = cls.getClassLoader();
    String nomeDaClasse=cls.getCanonicalName().replace(".", "/").concat(".class");
    System.out.println("nomeDaClasse = "+ nomeDaClasse);
    String urlClasseJava = cLoader.getSystemResource(nomeDaClasse).toString();
    _nomeArquivoJava=urlClasseJava.substring("jar:file:".length(), urlClasseJava.indexOf("!/"));
    System.out.println("_nomeArquivoJava = "+ _nomeArquivoJava);  
}
catch(Exception e) {
    e.printStackTrace();
}

输出结果将类似于此:

$ java -jar CasaInformatizada-0.1.4.jar  
dez 03, 2020 5:27:49 PM br.com.cvra.monitorArduino.Principal subirEscrivao
INFORMAÇÕES: /var/tmp/monitorArduino.xml
nomeDaClasse = br/com/cvra/monitorArduino/Principal.class
_nomeArquivoJava = /var/tmp/CasaInformatizada-0.1.4.jar

这是基于以下来源:

https://www.infoworld.com/article/2077485/java-tip-120--execute-self-extracting-jars.html https://www.tutorialspoint.com/java/lang/classloader_getsystemresource.htm


请解释您的代码做什么以及它是如何运作的。另外,请解释链接指向何处,它们与问题有什么关系以及它们如何帮助解决问题。 - M-Chen-3
该片段检索运行它的jar文件的路径。它使用String实例化的类的classLoader,然后使用类的全名(用斜杠替换句点),并添加“.class”以形成用于获取运行应用程序的文件的绝对路径的类文件名。链接指向关于jar文件的文章(第一个链接)和ClassLoader的开放式参考 (第二个链接),处理建议的代码片段的不同部分,并提供更多有关每个原始部分的详细信息以完成理解。 - Augusto Zumbi Rodrigues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接