Utworzono plik wykonywalny i za pomocą komendy commons-cli nadano użytkownikowi możliwość określenia parametrów wiersza polecenia podczas uruchamiania klienta. Wszystko dziala. Jednak podczas drukowania instrukcji użytkowania do słoika, chciałbym pokazać, co następuje:Pobierz nazwę pliku wykonywalnego słoika z metody main().
usage: java -jar myprog.jar <options> <file>
--help Display the help message
--debug Enable debugging
....
Drukowanie wszystkich opcji jest łatwo zrobić z Commons CLI. Jednak linia "użytkowania" to drapak głowy. Nie mogę wymyślić sposób, aby uzyskać nazwę "myprog.jar" z args [], które są przekazywane do aplikacji.
Czy jest jakiś łatwy sposób na zrobienie tego? Mógłbym użyć dość zawiłej metody, aby cofnąć ślad od klasy classloader klasy i dowiedzieć się, czy jest ona zawarta w słoiku, ale wydaje się to dość brzydką odpowiedzią na pytanie, które powinno być dość proste.
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;
}
}
próbował http://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file?lq=1? – Charles
Widziałem już ten link, ale wyglądało na to, że był to prawie "hack". Nie mogę uwierzyć, że nie ma bardziej bezpośredniego rozwiązania. Dodatkowo API stwierdza, że "getCodeSource()" może zwracać wartość null, ale nie wyjaśnia, w jakich warunkach, więc naturalnie zastanawiałem się, czy jest to metoda "bezpieczna". –