Java 从main()方法中获取可执行jar的名称

Java 从main()方法中获取可执行jar的名称,java,main,apache-commons-cli,Java,Main,Apache Commons Cli,我创建了一个可执行jar,并使用commons cli让用户能够在启动客户端时指定命令行参数。一切正常。但是,当我打印jar的用法语句时,我想显示以下内容: usage: java -jar myprog.jar <options> <file> --help Display the help message --debug Enable debugging .... 给你: new java.io.File(SomeClassInYourJar.class.getPr

我创建了一个可执行jar,并使用commons cli让用户能够在启动客户端时指定命令行参数。一切正常。但是,当我打印jar的用法语句时,我想显示以下内容:

usage: java -jar myprog.jar <options> <file>
--help Display the help message
--debug Enable debugging
....
给你:

new java.io.File(SomeClassInYourJar.class.getProtectionDomain()
  .getCodeSource()
  .getLocation()
  .getPath())
.getName()

编辑:我看到了您关于GetSourceCodeAPI的评论。这可能是Java中所能做的最好的了。关于
getCodeSource()
返回
null
,我认为它主要发生在
java.lang.*
中的类和其他源位置“隐藏”的特殊类上。但是应该适用于您自己的类。

在任何情况下,您都应该在调用getPath()之前添加一个.toURI()。这是因为java的URL实现中存在一些怪癖-有关详细信息,请参阅。

尝试过吗?我确实已经看到了该链接,但它看起来似乎也几乎是一个“黑客”。我不能相信没有更直接的解决办法。此外,API声明“getCodeSource()”可能返回null,但没有详细说明在何种条件下,所以我自然想知道这是否是一个“故障安全”方法。谢谢-这与@Charles在so链接中指出的相同。如上所述,我最担心的是
getCodeSource()
的api指出它可以为null,但没有详细说明在哪些条件下为null。另一个问题是,它没有考虑到类文件可能嵌套在归档文件中这一事实。所以我仍然需要检查
子字符串。就像我说的,它看起来有点笨拙,我很惊讶Java没有更好的解决方案。这主要是因为很少有理由知道您运行的jar文件的名称。功能应该(理想情况下)独立于名称。
new java.io.File(SomeClassInYourJar.class.getProtectionDomain()
  .getCodeSource()
  .getLocation()
  .getPath())
.getName()