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; } }
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With