web-dev-qa-db-fra.com

Récupère le nom du fichier exécutable dans la méthode main ()

J'ai créé un fichier exécutable et en utilisant commons-cli pour donner à l'utilisateur la possibilité de spécifier des paramètres de ligne de commande lors du lancement du client. Tout fonctionne bien. Cependant, lorsque j'imprime la déclaration d'utilisation du pot, je voudrais montrer ce qui suit:

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

L'impression de toutes les options se fait facilement avec commons-cli. Cependant, la ligne "utilisation" est le gratte-tête. Je n'arrive pas à trouver un moyen d'obtenir le nom "myprog.jar" à partir des arguments [] qui sont passés à l'application.

Existe-t-il un moyen simple de procéder? Je pourrais utiliser une méthode assez compliquée pour sauvegarder la trace du chargeur de classe de ma classe et déterminer si elle est contenue dans un bocal, mais cela semble être une réponse assez laide à ce qui devrait être une question assez simple.

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;
    }
}
29
Eric B.

Voici:

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

Edit: J'ai vu votre commentaire sur l'API getSourceCode. Eh bien, c'est probablement le meilleur que vous puissiez faire en Java. À propos de getCodeSource() retournant null, je pense que cela se produit principalement sur les classes dans Java.lang.* Et d'autres classes spéciales pour lesquelles l'emplacement source est "caché". Devrait fonctionner pour vos propres cours.

47
rodion

Vous devez dans tous les cas ajouter un .toURI () avant d'appeler getPath (). C'est à cause de certaines bizarreries dans l'implémentation d'URL de Java - voir comment encoder l'URL pour éviter les caractères spéciaux en Java pour plus de détails.

1
Michael Wyraz