java - desde - ¿Cómo hacer referencia a un archivo de recursos correctamente para JAR y depuración?
consumir dll desde java (6)
El problema es que dentro del IDE el getClass (). GetResource ("Ruta"); String no es CASE SENSITIVE cuando se accede a un archivo, pero cuando se ejecuta desde un jar lo es. Compruebe su capitalización en el directorio en comparación con el archivo. Funciona. Además, si prueba nuevo File (getClass (). GetResource ("Path"), el archivo no será legible fuera de IDE.
Tengo un problema desagradable al referirme a los recursos cuando uso un proyecto Maven y archivos Jar ...
Tengo todos mis recursos en una carpeta / src / main / resources dedicada que es parte de la ruta de compilación en Eclipse. Los archivos se referencian usando
getClass().getResource("/filename.txt")
Esto funciona bien en Eclipse pero falla en el archivo Jar: allí los recursos se encuentran en una carpeta directamente debajo de la raíz del jar ...
¿Alguien conoce una ''mejor práctica'' para hacer referencia a un archivo tanto en el JAR como (!) En Eclipse?
Editar: El problema es que si bien los recursos están ubicados en el JAR en una carpeta de "recursos" en el nivel superior, el método anterior no puede encontrar el archivo ...
Los contenidos de las carpetas de recursos de Maven se copian a target / classes y de allí a la raíz del archivo Jar resultante. Ese es el comportamiento esperado.
Lo que no entiendo es cuál es el problema en tu situación. getClass().getResource("/filename.txt")
referencia a un recurso a través de getClass().getResource("/filename.txt")
comienza en la raíz del classpath, ya sea que (o un elemento del mismo) sea target/classes
o la raíz del JAR. El único error posible que veo es que está utilizando el ClassLoader
incorrecto.
Asegúrese de que la clase que utiliza el recurso esté en el mismo artefacto (JAR) que el recurso y haga ThatClass.class.getResource("/path/with/slash")
o ThatClass.class.getClassLoader().getResource("path/without/slash")
.
Pero aparte de eso: si no funciona, probablemente estés haciendo algo mal en algún punto del proceso de compilación. ¿Puedes verificar que el recurso está en el JAR?
Si agrega el directorio de recursos en el archivo jar (para que esté debajo de la carpeta / resources en el jar, y si / src / main está en su ruta de compilación en eclipse, entonces debería poder hacer referencia a su archivo como:
getClass().getResource("/resources/filename.txt");
Lo cual debería funcionar en ambos entornos.
Solo copie el archivo en un directorio temporal.
String tempDir = System.getProperty("java.io.tmpdir");
File file = new File(tempDir.getAbsolutePath(), "filename.txt");
if (!file.exists()) {
InputStream is = (getClass().getResourceAsStream("/filename.txt"));
Files.copy(is, file.getAbsoluteFile().toPath());
}
Tuve un problema similar. Después de un día completo probando cada combinación y depuración, probé getClass (). GetResourceAsStream ("resources / filename.txt") y finalmente funcioné. Nada más ayudó.
Una vez que empaqueta el JAR, sus archivos de recursos ya no son archivos, sino que se getResource
, ¡así que getResource
no funcionará!
Use getResourceAsStream
.
Para obtener el contenido del "archivo", use https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html :
static public String getFile(String fileName)
{
//Get file from resources folder
ClassLoader classLoader = (new A_CLASS()).getClass().getClassLoader();
InputStream stream = classLoader.getResourceAsStream(fileName);
try
{
if (stream == null)
{
throw new Exception("Cannot find file " + fileName);
}
return IOUtils.toString(stream);
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
return null;
}