Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get name of executable jar from within main() method [duplicate]

I've created an executable jar and using commons-cli to give the user the ability to specify command line parameters when he launches the client. Everything works fine. However, when I print the usage statement for the jar, I would like to show the following:

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

Printing of all the options is easily done with commons-cli. However, the "usage" line is the head scratcher. I cannot seem to figure out a way to get the "myprog.jar" name from the args[] that are passed to the application.

Is there any easy way of doing this? I could use a pretty convoluted method to back trace from my class' classloader and figure out if it is contained within a jar, but that seems like a fairly ugly answer to what should be a pretty simple question.

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;     } } 
like image 287
Eric B. Avatar asked Jun 22 '12 14:06

Eric B.


1 Answers

Here you go:

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

Edit: I saw your comment about getSourceCode API. Well, this is probably the best you can do in Java. About getCodeSource() returning null, I think it mainly happens on classes in java.lang.* and other special classes for which the source location is "hidden". Should work for your own classes though.

like image 97
rodion Avatar answered Sep 25 '22 15:09

rodion