Mi código se ejecuta dentro de un archivo JAR, digamos foo.jar , y necesito saber, en el código, en qué carpeta se ejecuta foo.jar encuentra .
Entonces, si foo.jar está dentro C:\FOO\
, quiero obtener esa ruta sin importar cuál sea mi directorio de trabajo actual.
java
path
jar
executable-jar
Thiago Chaves
fuente
fuente
Respuestas:
Reemplace "MyClass" con el nombre de su clase.
Obviamente, esto hará cosas extrañas si su clase se cargó desde una ubicación que no es de archivo.
fuente
toURI()
paso es vital para evitar problemas con caracteres especiales, incluidos espacios y ventajas. La línea correcta es: Elreturn new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI());
usoURLDecoder
no funciona para muchos caracteres especiales. Vea mi respuesta a continuación para más detalles.getProtectionDomain
es nulo si está obteniendo su clase de una pista de seguimiento:val strace = Thread.currentThread().getStackTrace; val path = strace(1).getClass.getProtectionDomain
La mejor solución para mí:
Esto debería resolver el problema con espacios y caracteres especiales.
fuente
URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8");
) en Linux. Sin embargo, no probé en Windows.URLDecoder
para decodificar caracteres especiales. En particular, los caracteres como+
se decodificarán erróneamente en espacios. Vea mi respuesta para más detalles.Para obtener el
File
para un dadoClass
, hay dos pasos:Class
aURL
URL
aFile
Es importante comprender ambos pasos y no combinarlos.
Una vez que tenga el
File
, puede llamargetParentFile
para obtener la carpeta que lo contiene, si eso es lo que necesita.Paso 1:
Class
aURL
Como se discutió en otras respuestas, hay dos formas principales de encontrar una
URL
relevante para aClass
.URL url = Bar.class.getProtectionDomain().getCodeSource().getLocation();
URL url = Bar.class.getResource(Bar.class.getSimpleName() + ".class");
Ambos tienen pros y contras.
El
getProtectionDomain
enfoque produce la ubicación base de la clase (por ejemplo, el archivo JAR que contiene). Sin embargo, es posible que la política de seguridad del tiempo de ejecución de Java se ejecuteSecurityException
al llamargetProtectionDomain()
, por lo que si su aplicación necesita ejecutarse en una variedad de entornos, lo mejor es probar en todos ellos.El
getResource
enfoque produce la ruta de recursos de URL completa de la clase, desde la cual deberá realizar una manipulación de cadena adicional. Puede ser unfile:
camino, pero también podría serjar:file:
o incluso algo más desagradablebundleresource://346.fwk2106232034:4/foo/Bar.class
cuando se ejecuta dentro de un marco OSGi. Por el contrario, elgetProtectionDomain
enfoque produce correctamente unfile:
URL incluso desde OSGi.Tenga en cuenta que tanto
getResource("")
ygetResource(".")
fallaron en mis pruebas, cuando la clase residía dentro de un archivo JAR; ambas invocaciones volvieron nulas. Por lo tanto, recomiendo la invocación n. ° 2 que se muestra arriba, ya que parece más segura.Paso 2:
URL
aFile
De cualquier manera, una vez que tenga un
URL
, el siguiente paso es convertirlo en aFile
. Este es su propio desafío; vea la publicación del blog de Kohsuke Kawaguchi al respecto para obtener detalles completos, pero en resumen, puede usarnew File(url.toURI())
siempre que la URL esté completamente bien formada.Por último, desalentaría mucho el uso
URLDecoder
. Algunos caracteres de la URL,:
y/
en particular, no son caracteres válidos codificados con URL. Desde el Javadoc URLDecoder :En la práctica,
URLDecoder
generalmente no arrojaIllegalArgumentException
como se amenaza anteriormente. Y si su ruta de archivo tiene espacios codificados como%20
, este enfoque puede parecer que funciona. Sin embargo, si la ruta de su archivo tiene otros caracteres no alfabéticos, como por ejemplo+
, tendrá problemas paraURLDecoder
cambiar la ruta de su archivo.Código de trabajo
Para lograr estos pasos, puede tener métodos como los siguientes:
Puede encontrar estos métodos en la biblioteca SciJava Common :
fuente
También puedes usar:
fuente
Use ClassLoader.getResource () para encontrar la URL de su clase actual.
Por ejemplo:
(Este ejemplo está tomado de una pregunta similar ).
Para encontrar el directorio, deberá desarmar la URL manualmente. Consulte el tutorial JarClassLoader para ver el formato de una URL jar.
fuente
NPE
porque no respondió a la pregunta que se le hizo (se le preguntó la ruta al directorio JAR y respondió a una pregunta absolutamente diferente: ruta a la clase). 2. Como señalaron otros, y obtuve el mismo problema, no funciona para los applets. 3. camino de retorno no sea de la representación ruta canónica en absoluto:jar:file:/listener/build/libs/listener-1.0.0-all.jar!/shared/Test.class
.Me sorprende ver que ninguno recientemente propuso su uso
Path
. Aquí sigue una cita: " LaPath
clase incluye varios métodos que pueden usarse para obtener información sobre la ruta, acceder a elementos de la ruta, convertir la ruta a otras formas o extraer partes de una ruta "Por lo tanto, una buena alternativa es obtener el
Path
objest como:fuente
La única solución que funciona para mí en Linux, Mac y Windows:
fuente
Tuve el mismo problema y lo resolví de esa manera:
Espero haberte sido de ayuda.
fuente
Aquí hay una actualización a otros comentarios, que me parecen incompletos para los detalles de
fuente
URLDecoder
para decodificar caracteres especiales. En particular, los caracteres como+
se decodificarán erróneamente en espacios. Vea mi respuesta para más detalles.URLDecoder
, a pesar de su nombre, es para decodificar URL y formar nombres y valores de parámetros, no URL.Para obtener la ruta de ejecución del archivo jar, he estudiado las soluciones anteriores y probado todos los métodos que existen alguna diferencia entre sí. Si estos códigos se ejecutan en Eclipse IDE, todos deberían poder encontrar la ruta del archivo, incluida la clase indicada, y abrir o crear un archivo indicado con la ruta encontrada.
Pero es complicado, cuando ejecuta el archivo jar ejecutable directamente o a través de la línea de comando, fallará ya que la ruta del archivo jar obtenida de los métodos anteriores dará una ruta interna en el archivo jar, es decir, siempre da una ruta como
rsrc: nombre-proyecto (tal vez debería decir que es el nombre del paquete del archivo de clase principal - la clase indicada)
No puedo convertir la ruta rsrc: ... a una ruta externa, es decir, cuando ejecuta el archivo jar fuera del IDE de Eclipse, no puede obtener la ruta del archivo jar.
La única forma posible de obtener la ruta de ejecución del archivo jar fuera de Eclipse IDE es
esta línea de código puede devolver la ruta viva (incluido el nombre del archivo) del archivo jar en ejecución (tenga en cuenta que la ruta de retorno no es el directorio de trabajo), como el documento de Java y algunas personas dijeron que devolverá las rutas de todos los archivos de clase en el mismo directorio, pero como mis pruebas si en el mismo directorio incluyen muchos archivos jar, solo devuelve la ruta de ejecución de jar (sobre el problema de las rutas múltiples, de hecho, sucedió en Eclipse).
fuente
java.class.path
Puede ser multivalor. Uno de esos valores ciertamente proporcionará el directorio o el archivo JAR donde se encuentra la clase actual, pero ¿cuál?Otras respuestas parecen apuntar a la fuente del código que es la ubicación del archivo Jar que no es un directorio.
Utilizar
fuente
la respuesta seleccionada arriba no funciona si ejecuta su jar haciendo clic en él desde el entorno de escritorio Gnome (no desde cualquier script o terminal).
En cambio, me gusta que la siguiente solución esté funcionando en todas partes:
fuente
URLDecoder
para decodificar caracteres especiales. En particular, los caracteres como+
se decodificarán erróneamente en espacios. Vea mi respuesta para más detalles.NullPointerException
NPE
si no hay recursos en JAR.En realidad, aquí hay una versión mejor: la anterior fallaba si el nombre de una carpeta tenía un espacio.
En cuanto a fallar con los applets, de todos modos no tendrías acceso a los archivos locales. No sé mucho sobre JWS, pero para manejar archivos locales, ¿no podría ser posible descargar la aplicación?
fuente
Traté de obtener la ruta de ejecución de jar usando
c: \ app> java -jar application.jar
Al ejecutar la aplicación jar denominada "application.jar", en Windows en la carpeta " c: \ app ", el valor de la variable de cadena "carpeta" era " \ c: \ app \ application.jar " y tuve problemas para probar la corrección del camino
Así que traté de definir "prueba" como:
para obtener la ruta en un formato correcto como " c: \ app " en lugar de " \ c: \ app \ application.jar " y noté que funciona.
fuente
La solución más simple es pasar la ruta como argumento al ejecutar el jar.
Puede automatizar esto con un script de shell (.bat en Windows, .sh en cualquier otro lugar):
Solía
.
pasar el directorio de trabajo actual.ACTUALIZAR
Es posible que desee pegar el archivo jar en un subdirectorio para que los usuarios no hagan clic accidentalmente en él. Su código también debe verificar para asegurarse de que se hayan proporcionado los argumentos de la línea de comandos y proporcionar un buen mensaje de error si faltan los argumentos.
fuente
Tuve que perder el tiempo mucho antes de finalmente encontrar una solución funcional (y corta).
Es posible que
jarLocation
venga con un prefijo comofile:\
ojar:file\
, que se puede eliminar mediante el usoString#substring()
.fuente
La ruta siempre se refiere al recurso dentro del archivo jar.
fuente
String path = new File(getClass().getResource("").getPath()).getParentFile().getParent(); File jarDir = new File(path.substring(5));
getResource("")
ygetResource(".")
fallaron en mis pruebas, cuando la clase residía dentro de un archivo JAR; ambas invocaciones volvieron nulas.NullPointerException
.Funciona bien en Windows
fuente
Algo que es frustrante es que cuando está desarrollando en Eclipse
MyClass.class.getProtectionDomain().getCodeSource().getLocation()
devuelve el/bin
directorio que es excelente, pero cuando lo compila en un jar, la ruta incluye la/myjarname.jar
parte que le da nombres de archivo ilegales.Para que el código funcione tanto en el ide como una vez que se compila en un jar, utilizo el siguiente fragmento de código:
fuente
No estoy realmente seguro acerca de los demás, pero en mi caso no funcionó con un "Jar ejecutable" y lo puse a trabajar arreglando los códigos de la respuesta phchen2 y otro de este enlace: ¿Cómo obtener la ruta de un archivo JAR en ejecución? El código:
fuente
He intentado varias de las soluciones allí, pero ninguna arrojó resultados correctos para el caso (probablemente especial) de que el jar ejecutable se ha exportado con "Empaquetar bibliotecas externas" en Eclipse. Por alguna razón, todas las soluciones basadas en el ProtectionDomain resultan nulas en ese caso.
Al combinar algunas de las soluciones anteriores, logré lograr el siguiente código de trabajo:
fuente
Prueba esto:
fuente
Este método, llamado desde el código en el archivo, devuelve la carpeta donde está el archivo .jar. Debería funcionar en Windows o Unix.
Derivado del código en: Determinar si se ejecuta desde JAR
fuente
Mencione que solo está registrado
Windows
pero creo que funciona perfectamente en otros sistemas operativos [Linux,MacOs,Solaris
] :).Tenía 2
.jar
archivos en el mismo directorio. Quería que desde un.jar
archivo comenzara el otro.jar
archivo que está en el mismo directorio.El problema es que cuando lo inicia desde el
cmd
directorio actual essystem32
.;][[;'57f2g34g87-8+9-09!2#@!$%^^&()
o()%&$%^@#
funciona bien.ProcessBuilder
el siguiente de la siguiente manera:🍂 ..
🍂
getBasePathForClass(Class<?> classs)
:fuente
Este código funcionó para mí:
fuente
Este código me funcionó para identificar si el programa se está ejecutando dentro de un archivo JAR o IDE:
Si necesito obtener la ruta completa de Windows del archivo JAR, estoy usando este método:
Mi código completo trabajando con una aplicación Spring Boot usando la
CommandLineRunner
implementación, para asegurar que la aplicación siempre se ejecute dentro de una vista de consola (Doble clic por error en el nombre del archivo JAR), estoy usando el siguiente código:fuente
Escribo en Java 7 y pruebo en Windows 7 con el tiempo de ejecución de Oracle y Ubuntu con el tiempo de ejecución de código abierto. Esto funciona perfecto para esos sistemas:
La ruta para el directorio padre de cualquier archivo jar en ejecución (suponiendo que la clase que llama a este código es un hijo directo del archivo jar):
Entonces, el camino de foo.jar sería:
Nuevamente, esto no fue probado en ninguna Mac o Windows anterior
fuente
El
getProtectionDomain
enfoque puede no funcionar a veces, por ejemplo, cuando tiene que encontrar el jar para algunas de las clases principales de Java (por ejemplo, en miStringBuilder
clase de caso dentro de IBM JDK), sin embargo, lo siguiente funciona a la perfección:fuente
Tengo otra forma de obtener la ubicación de String de una clase.
La cadena de salida tendrá la forma de
Los espacios y otros caracteres se manejan, y en la forma sin
file:/
. Entonces será más fácil de usar.fuente