Estoy tratando de encontrar un camino hacia un Recurso, pero no he tenido suerte.
Esto funciona (tanto en IDE como con JAR) pero de esta manera no puedo obtener una ruta a un archivo, solo el contenido del archivo:
ClassLoader classLoader = getClass().getClassLoader();
PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));
Si hago esto:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("config/netclient.p").getFile());
El resultado es:
java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)
¿Hay alguna manera de obtener una ruta a un archivo de recursos?
Respuestas:
Esto es deliberado. El contenido del "archivo" puede no estar disponible como un archivo. Recuerde que está tratando con clases y recursos que pueden ser parte de un archivo JAR u otro tipo de recurso. El cargador de clases no tiene que proporcionar un identificador de archivo al recurso, por ejemplo, el archivo jar puede no haberse expandido a archivos individuales en el sistema de archivos.
Cualquier cosa que pueda hacer obteniendo un archivo java.io.File se puede hacer copiando la transmisión en un archivo temporal y haciendo lo mismo, si un archivo java.io.File es absolutamente necesario.
fuente
Al cargar un recurso, asegúrese de notar la diferencia entre:
y
Supongo que esta confusión está causando la mayoría de los problemas al cargar un recurso.
Además, cuando está cargando una imagen es más fácil de usar
getResourceAsStream()
:Cuando realmente tiene que cargar un archivo (sin imagen) desde un archivo JAR, puede intentar esto:
fuente
bin
carpeta y vaya al directorio de la clase que carga los recursos antes de usar la ruta `/com/myorg/filename.ext '.La respuesta de una línea es:
Básicamente, el
getResource
método proporciona la URL. Desde esta URL puede extraer la ruta llamandotoExternalForm()
Referencias
getResource () , toExternalForm ()
fuente
file:/
a la ruta, que funciona en jar pero no en IDEPasé un tiempo jugando con este problema, porque ninguna solución que encontré realmente funcionó, ¡curiosamente! El directorio de trabajo con frecuencia no es el directorio del JAR, especialmente si se ejecuta un JAR (o cualquier otro programa) desde el menú Inicio en Windows. Así que esto es lo que hice, y funciona para archivos .class ejecutados desde fuera de un JAR tan bien como funciona para un JAR. (Solo lo probé en Windows 7.)
fuente
si
netclient.p
está dentro de un archivo JAR, no tendrá una ruta porque ese archivo se encuentra dentro de otro archivo. en ese caso, el mejor camino que puedes tener es realmentefile:/path/to/jarfile/bot.jar!/config/netclient.p
.fuente
Debe comprender la ruta dentro del archivo jar.
Simplemente consúltelo relativo. Entonces, si tiene un archivo (myfile.txt), ubicado en foo.jar bajo el
\src\main\resources
directorio (estilo maven). Te referirías a ella como:Si vuelca su jar usando
jar -tvf myjar.jar
, verá la salida y la ruta relativa dentro del archivo jar, y usará SLASHES ADELANTE.fuente
File.separator
.En mi caso, he usado un objeto URL en lugar de Path.
Expediente
Recurso en classpath usando classloader
Cuando necesito leer el contenido, puedo usar el siguiente código:
Y puede acceder al contenido utilizando un InputStream.
fuente
Este es el mismo código del usuario Tombart con flujo de flujo y cierre para evitar una copia incompleta del contenido del archivo temporal del recurso jar y tener nombres de archivo temporales únicos.
fuente
Un archivo es una abstracción para un archivo en un sistema de archivos, y los sistemas de archivos no saben nada sobre el contenido de un JAR.
Pruebe con un URI, creo que hay un protocolo jar: // que podría ser útil para sus propósitos.
fuente
El siguiente camino funcionó para mí:
classpath:/path/to/resource/in/jar
fuente
Obtener esto
getSystemResourceAsStream
es la mejor opción. Al obtener el flujo de entrada en lugar del archivo o la URL, funciona en un archivo JAR y de forma independiente.fuente
Puede que sea un poco tarde, pero puede usar mi biblioteca KResourceLoader para obtener un recurso de su jar:
fuente
Cuando se encuentra en un archivo jar, el recurso se encuentra absolutamente en la jerarquía del paquete (no en la jerarquía del sistema de archivos). Entonces, si tiene la clase com.example.Sweet cargando un recurso llamado "./default.conf", entonces el nombre del recurso se especifica como "/com/example/default.conf".
Pero si está en un frasco, entonces no es un archivo ...
fuente
Dentro de su carpeta de recursos (java / main / resources) de su jar agregue su archivo (asumimos que ha agregado un archivo xml llamado imports.xml ), luego inyecte
ResourceLoader
si usa spring como abajodentro de la función de recorrido, escriba el siguiente código para cargar el archivo:
fuente
Quizás este método pueda usarse para una solución rápida.
fuente
java.lang.NullPointerException: Attempt to invoke virtual method 'java.security.CodeSource java.security.ProtectionDomain.getCodeSource()' on a null object reference
sigue el código!
/ src / main / resources / file
fuente