2012-06-22 35 views
21

Creé un archivo ejecutable y uso commons-cli para dar al usuario la capacidad de especificar parámetros de línea de comandos cuando inicia el cliente. Todo funciona bien Sin embargo, al imprimir la descripción de uso del frasco, me gustaría mostrar lo siguiente:Obtener el nombre del archivo ejecutable desde el método main()

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

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

¿Hay alguna manera fácil de hacer esto? Podría usar un método bastante intrincado para rastrear desde el cargador de clases de mi clase y descubrir si está contenido dentro de un contenedor, pero eso parece una respuesta bastante fea para 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; 
    } 
} 
+0

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

+0

Ya vi ese enlace, pero parecía como si fuera casi un "truco" también. No puedo creer que no haya una solución más directa. Además, la API establece que "getCodeSource()" puede devolver nulo, pero no detalla bajo qué condiciones, por lo que naturalmente me pregunté si este era un método "a prueba de fallas" para usar. –

Respuesta

33

Aquí van:

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

Editar: vi tu comentario sobre API getSourceCode. Bueno, esto es probablemente lo mejor que puedes hacer en Java. Aproximadamente getCodeSource() devolviendo null, creo que ocurre principalmente en las clases en java.lang.* y otras clases especiales para las cuales la ubicación de origen está "oculta". Aunque debería funcionar para tus propias clases.

+0

Gracias - eso es lo mismo que @Charles señaló en el enlace SO. Mi mayor preocupación, como he mencionado anteriormente, es que la API de 'getCodeSource()' indica que puede ser nula, pero no detalla en qué condiciones. –

+0

El otro problema con esto es que no tiene en cuenta el hecho de que el archivo de clase puede estar anidado dentro de los archivos. Por lo tanto, todavía tendría que comprobar si hay una subcadena '!'. Como dije, parece un poco torpe y estoy bastante sorprendido de que Java no tenga una mejor solución. –

+0

Se debe principalmente a que rara vez hay una razón para saber el nombre del archivo jar desde el que se está ejecutando. La funcionalidad debería (idealmente) ser independiente del nombre. – Charles

Cuestiones relacionadas