Cómo obtener la ruta de los recursos dentro de un frasco

Sé que hay una serie de preguntas similares y las he revisado sin éxito. Probablemente me estoy perdiendo algo muy básico. Tengo archivos html en un paquete de recursos dentro del archivo jar de la aplicación y necesito recuperar sus rutas para leerlos y actualizarlos. Aquí está mi código:

URL url  = ClassLoader.class.getResource("/com/lamalva/ressources/test.html");
System.out.println(url);          
java.awt.Desktop.getDesktop().browse(java.net.URI.create(url.toString()));

Cuando ejecuto este código desde NetBeans IDE, el resultado es: file:/Users/Philippe/NetBeansProjects/Test/build/classes/com/lamalva/ressources/SatelliteQuotaMonitor.html y el archivo html está abierto en el navegador como se esperaba, pero cuando Ejecuto el archivo jar desde la Terminal OSX, el resultado es: jar:file:/Users/Philippe/.Trash/Test/Test.jar!/com/lamalva/ressources/SatelliteQuotaMonitor.html y el archivo html no se abre. Haga lo que haga, no logro encontrar el camino correcto. Siempre tengo el "Test.jar!" en el centro. agradeceré mucho la ayuda

preguntado el 03 de mayo de 12 a las 17:05

¿Por qué su archivo JAR se ejecuta fuera de su papelera de OSX? En cualquier caso, estoy bastante seguro de que su navegador predeterminado no sabrá cómo recuperar recursos HTML desde un archivo JAR. -

No sé por qué el archivo jar se ejecuta fuera de la papelera. El problema que tengo no tiene una respuesta sencilla. Sacaré mis archivos del contenedor y los incluiré en el archivo zip, lo cual es fácil y debería funcionar. -

5 Respuestas

La respuesta de una línea es:

Cadena de ruta = this.getClass().getClassLoader().getResource().toExternalForm().

Básicamente, el método getResource proporciona la URL. Desde esta URL puede extraer la ruta llamando a ExternalForm().

Referencias: https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource(java.lang.String) https://docs.oracle.com/javase/7/docs/api/java/net/URL.html#toExternalForm()

respondido 26 nov., 14:12

Parece funcionar en mi IDE, pero no desde un archivo jar solo. - Woodrow

¿Necesita leer y actualizar los recursos en el archivo jar?

Puede leer el contenido de un flujo de entrada: use una ruta relativa si el recurso reside en el mismo paquete que el archivo de clase.

InputStream in = this.getClass().getResourceAsStream("/class/path/to/file");

Para escribir, es probable que deba leer el contenido del contenedor existente, modificar las partes que desee y luego escribir el contenido actualizado mediante JarInputStream y JarOutputStream.

contestado el 03 de mayo de 12 a las 18:05

Mis recursos son archivos html que necesito actualizar y abrir en el navegador predeterminado. No necesito leerlos en la aplicación, pero necesito su ruta para abrirlos en el navegador. Los archivos html se almacenan en los recursos porque necesitan javascripts en recursos/scripts - philippehenri

Una URL en Java no es necesariamente una URL que un navegador web pueda entender. Deberá extraer el archivo jar a una ubicación temporal, ya que el navegador no podrá mostrar los archivos dentro del jar. Eche un vistazo a java.util.jar.JarFile: deberá iterar sobre el método de las entradas () y extraer el contenido. - cvanes

Para abrir un recurso desde classpath en el navegador web de la plataforma predeterminada, tiene dos opciones. Extraiga y copie dicho recurso en una ubicación temporal en un sistema de archivos y pase file: url. Otra opción, y probablemente mejor, es ejecutar un servidor web integrado (como Jetty) y servir los recursos directamente desde su classpath.

contestado el 03 de mayo de 12 a las 18:05

Una URL con el ! el subprotocolo de descompresión no se puede usar en un navegador normal. Al igual que ssh: (acceso a la terminal) o smtp:/mailto: (Email). Además, "file:..../my.jar!..." es una extensión tan inutilizable de las URL normales.

Está el JTextPane/JEditorPane con soporte HTML limitado. Y algunos proyectos de navegador Java.

Tal vez se podría usar la incrustación del servidor web java Jetty.

contestado el 03 de mayo de 12 a las 18:05

Necesitas usar varios ClassLoader si quieres un recurso en un frasco. Este fragmento también funciona en AppServers.

En este ejemplo leí de sqlite-jdbc-3.7.2.jar el archivo ubicado en org.sqlite paquete.

public class Main {

private static InputStream getResourceAsStream(String resource) throws FileNotFoundException {
    String stripped = resource.startsWith("/") ? resource.substring(1) : resource;
    InputStream stream = null;
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if (classLoader != null) {
        stream = classLoader.getResourceAsStream(stripped);
    }
    if (stream == null) {
        stream = MyClass.class.getResourceAsStream(resource);
    }
    if (stream == null) {
        stream = MyClass.class.getClassLoader().getResourceAsStream(stripped);
    }
    if (stream == null) {
        throw new FileNotFoundException("File not found: " + resource);
    }
    return stream;
}

public static void main(String[] args) throws FileNotFoundException {
    // Read file from JAR sqlite-jdbc-3.7.2.jar
    Scanner sc = new Scanner(getResourceAsStream("org/sqlite/NativeDB.c"));
    while(sc.hasNextLine()) {
        System.out.println(sc.nextLine());
    }
}

}

Para más detalles leer Cargador de clases Java

Si desea actualizar los contenidos, puede Inspector de tarros ayudarte.

contestado el 03 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.