La guía o código que encontrarás en este post es la resolución más sencilla y válida que encontramos a esta inquietud o dilema.
Solución:
Tuve problemas con el uso de la getClass().getResource("filename.txt")
método. Al leer las instrucciones de los documentos de Java, si su recurso no está en el mismo paquete que la clase desde la que intenta acceder al recurso, entonces debe darle una ruta relativa que comience con '/'
. La estrategia recomendada es colocar sus archivos de recursos en una carpeta de “recursos” en el directorio raíz. Entonces, por ejemplo, si tienes la estructura:
src/main/com/mycompany/myapp
luego puede agregar una carpeta de recursos según lo recomendado por maven en:
src/main/resources
además, puede agregar subcarpetas en la carpeta de recursos
src/main/resources/textfiles
y decir que su archivo se llama myfile.txt
así que tienes
src/main/resources/textfiles/myfile.txt
Ahora aquí es donde entra el estúpido problema de la ruta. Digamos que tienes una clase en tu com.mycompany.myapp package
y desea acceder a la myfile.txt
archivo de su carpeta de recursos. Algunos dicen que necesitas dar el:
"/main/resources/textfiles/myfile.txt" path
o
"/resources/textfiles/myfile.txt"
ambos están mal. después de que corrí mvn clean compile
los archivos y carpetas se copian en:
myapp/target/classes
carpeta. Pero la carpeta de recursos no está allí, solo las carpetas en la carpeta de recursos. Así que tienes:
myapp/target/classes/textfiles/myfile.txt
myapp/target/classes/com/mycompany/myapp/*
por lo que el camino correcto para dar a la getClass().getResource("")
método es:
"/textfiles/myfile.txt"
aquí está:
getClass().getResource("/textfiles/myfile.txt")
Esto ya no volverá null, pero devolverá su clase. Espero que esto ayude a alguien. Me resulta extraño, que el "resources"
carpeta no se copia también, pero sólo las subcarpetas y archivos directamente en el "resources"
carpeta. Me parecería lógico que el "resources"
la carpeta también se encontraría en "myapp/target/classes"
Proporcione la ruta relativa al cargador de clases, no la clase de la que obtiene el cargador. Por ejemplo:
resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
Con la esperanza de proporcionar información adicional para aquellos que no entienden esto tan rápido como los demás, me gustaría proporcionar mi escenario, ya que tiene una configuración ligeramente diferente. Mi proyecto se configuró con la siguiente estructura de directorios (usando Eclipse):
Project/ src/ // application source code org/ myproject/ MyClass.java test/ // unit tests res/ // resources images/ // PNG images for icons my-image.png xml/ // XSD files for validating XML files with JAXB my-schema.xsd conf/ // default .conf file for Log4j log4j.conf lib/ // libraries added to build-path via project settings
Estaba teniendo problemas para cargar mis recursos desde el resolución directorio. Quería que todos mis recursos estuvieran separados de mi código fuente (simplemente para fines de administración/organización). Entonces, lo que tenía que hacer era agregar el resolución directorio a la Construir camino y luego acceda al recurso a través de:
static final ClassLoader loader = MyClass.class.getClassLoader();
// in some function
loader.getResource("images/my-image.png");
loader.getResource("xml/my-schema.xsd");
loader.getResource("conf/log4j.conf");
NOTA: los /
se omite desde el principio del recurso string porque estoy usando ClassLoader.getResource(String) en lugar de Class.getResource(String).
Eres capaz de animar nuestra función ejecutando un comentario o dejando una valoración te estamos eternamente agradecidos.