Obtener el nombre del jar ejecutable desde el método main () [duplicar]


Esta pregunta ya tiene una respuesta aquí:

He creado un jar ejecutable y usando commons-cli para dar al usuario la capacidad de especificar parámetros de línea de comandos cuando lanza el cliente. Todo funciona bien. Sin embargo, cuando imprimo la declaración de uso del frasco, me gustaría para mostrar lo siguiente:

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

La impresión de todas las opciones se hace fácilmente con commons-cli. Sin embargo, la línea de " uso " es el rascador de cabeza. Parece que no puedo encontrar una manera de conseguir el "myprog".jar " nombre de los args [] que se pasan a la aplicación.

¿Hay alguna manera fácil de hacer esto? Podría usar un método bastante enrevesado para rastrear desde el cargador de clases de mi clase y averiguar si está contenido dentro de un frasco, pero eso parece una respuesta bastante fea a lo que debería ser una pregunta bastante 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;
    }
}
Author: vaxquis, 2012-06-22

2 answers

Aquí tienes:

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

Edit: He visto tu comentario sobre getSourceCode API. Bueno, esto es probablemente lo mejor que puedes hacer en Java. Acerca de getCodeSource() que devuelve null, creo que sucede principalmente en clases en java.lang.* y otras clases especiales para las que la ubicación de origen está "oculta". Deberías trabajar para tus propias clases.

 39
Author: rodion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-22 15:45:37

En cualquier caso, debe agregar un .gira() antes de llamar a getPath(). Esto se debe a algunas peculiaridades en la implementación de URL de java: consulte cómo codificar URL para evitar caracteres especiales en java para obtener más detalles.

 1
Author: Michael Wyraz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:13:57