Saltar al contenido

recurso abierto con ruta relativa en Java

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 packagey 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 compilelos 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *