我创建了一个可执行jar并使用commons-cli为用户提供了在启动客户端时指定命令行参数的能力。一切正常。但是,当我打印jar的用法语句时,我想显示以下内容:
usage: java -jar myprog.jar <options> <file>
--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;
}
}
答案 0 :(得分:44)
你走了:
new java.io.File(SomeClassInYourJar.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath())
.getName()
编辑:我看到了您对getSourceCode API的评论。嗯,这可能是你用Java做的最好的。关于getCodeSource()
返回null
,我认为它主要发生在java.lang.*
中的类以及源位置为“隐藏”的其他特殊类中。应该适用于你自己的课程。
答案 1 :(得分:1)
在调用getPath()之前,您应该在任何情况下添加.toURI()。这是因为java的URL实现中存在一些怪癖 - 有关详细信息,请参阅how to encode URL to avoid special characters in java。