2012-06-22 7 views
21

Ich habe eine ausführbare jar erstellt und mit commons-cli dem Benutzer die Möglichkeit zu geben, Kommandozeilen-Parameter angeben, wenn er den Client startet. Alles funktioniert gut. Allerdings, wenn ich die Verwendungsaussage für das Glas drucken, würde Ich mag folgend zeigen:Namen ausführbarer jar Get aus main() Methode

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

Druck von allen Optionen ist leicht getan mit commons-cli. Die Zeile "Usage" ist jedoch der Head Scratcher. Ich kann anscheinend keinen Weg finden, den "myprog.jar" Namen von den args [] zu erhalten, die an die Anwendung übergeben werden.

Gibt es eine einfache Möglichkeit, dies zu tun? Ich könnte ein ziemlich verworren Methode trace aus meiner Klasse Klassenlader zu sichern und herauszufinden, ob es in einem Gefäß enthalten ist, aber das scheint wie eine ziemlich hässliche Antwort auf das, was sollte eine ziemlich einfache Frage sein.

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

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

+0

Ich habe diesen Link schon gesehen, aber es sah so aus, als wäre es fast ein "Hack". Ich kann nicht glauben, dass es keine direktere Lösung gibt. Außerdem gibt die API an, dass "getCodeSource()" möglicherweise null zurückgibt, aber unter welchen Bedingungen nicht, daher fragte ich mich natürlich, ob dies eine "ausfallsichere" Methode ist. –

Antwort

33

Hier gehen Sie:

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

Edit: Ich sah Ihre Kommentare über getSourceCode API. Nun, das ist wahrscheinlich das Beste, was Sie in Java tun können. Über getCodeSource() Rückkehr null, ich denke, es vor allem in java.lang.* und anderen speziellen Klassen auf Klassen geschieht, für die das Quellenort „versteckt“ ist. Sollte aber für Ihre eigenen Klassen arbeiten.

+0

Danke - das ist das gleiche, worauf @Charles in der SO-Verknüpfung hingewiesen hat. Meine größte Sorge, wie ich oben erwähnt habe, ist, dass die API für 'getCodeSource()' angibt, dass es null sein kann, aber nicht unter welchen Bedingungen. –

+0

Das andere Problem dabei ist, dass es die Tatsache nicht berücksichtigt, dass die Klassendatei in Archiven verschachtelt sein kann. Ich müsste also immer noch nach einem '!' Teilstring suchen. Wie ich schon sagte, es scheint ein wenig klobig und bin ziemlich überrascht, dass Java keine bessere Lösung hat. –

+0

Es liegt hauptsächlich daran, dass es selten einen Grund gibt, den Namen der JAR-Datei zu kennen, von der Sie ausgehen. Die Funktionalität sollte (idealerweise) unabhängig vom Namen sein. – Charles