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

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

usage: java -jar myprog.jar   --help Display the help message --debug Enable debugging .... 

使用commons-cli可以轻松打印所有选项。 然而,“使用”线是头部刮擦。 我似乎无法找到从args []获取传递给应用程序的“myprog.jar”名称的方法。

这有什么简单的方法吗? 我可以使用一个非常复杂的方法从我的类的类加载器返回跟踪,并确定它是否包含在jar中,但这似乎是一个相当难看的答案,应该是一个非常简单的问题。

 private String getPath(Class cls) { String cn = cls.getName(); String rn = cn.replace('.', '/') + ".class"; String path = getClass().getClassLoader().getResource(rn).getPath(); int ix = path.indexOf("!"); if(ix >= 0) { return path.substring(0, ix); } else { return path; } } 

干得好:

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

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

在调用getPath()之前,您应该在任何情况下添加.toURI()。 这是因为java的URL实现中的一些怪癖 – 请参阅如何编码URL以避免java中的特殊字符以获取详细信息。