2012-06-22 26 views
21

我创建了一个可执行jar并使用commons-cli为用户提供了在启动客户端时指定命令行参数的功能。一切正常。然而,当我打印用法语句罐子,我想显示如下:从main()方法中获取可执行jar名称

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

的所有选项打印很容易用公地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

已尝试http://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file?lq=1? – Charles

+0

我确实已经看到该链接,但它看起来好像也几乎是“黑客”。我不相信没有更直接的解决方案。另外,API声明“getCodeSource()”可能返回null,但没有详细说明在哪些条件下,所以我自然想知道这是否是一种“自动防故障”方法。 –

回答

33

在这里你去:

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

编辑:我看到你关于getSourceCode API评论。那么,这可能是你在Java中可以做的最好的。关于getCodeSource()返回null,我认为它主要发生在java.lang.*以及源位置为“隐藏”的其他特殊类的类中。应该为你自己的班级工作。

+0

谢谢 - 这与@Charles在SO链接中指出的一样。正如我上面提到的,我最关心的是getCodeSource()的api表明它可以为null,但没有详细说明在哪些条件下。 –

+0

另一个问题是,它没有考虑到类文件可能嵌套在档案中的事实。所以我仍然需要检查一个'!'子字符串。就像我说的那样,Java似乎有点笨重,并且对Java没有更好的解决方案感到非常惊讶。 –

+0

这主要是因为很少有理由知道您正在运行的jar文件的名称。功能应该(理想情况下)与名称无关。 – Charles

相关问题