2012-01-27 18 views
8

he estado rompiendo la cabeza por esto desde hace un tiempo y ahora no puedo encontrar una solución para este problema:Archivo y bundleresource: // URLs

Tengo una aplicación Eclipse RCP que utiliza una biblioteca personalizada empaquetado como tarro. Desde el complemento, estoy llamando a un método dentro del contenedor. Dentro de este método, estoy "obteniendo" un recurso usando this.class.getResource(relPath), mientras que relPath es una ruta relativa a un archivo que necesito. Esto me devuelve un URL que puedo usar para construir un File.

Ahora, esto funciona perfectamente si no estoy llamando a este método desde el complemento, sino desde un simple programa Java. La diferencia: Eclipse cargador de clases de RCP devuelve un URL de protocolo bundleresource:// que no está soportada por File, mientras que cuando se ejecuta un simple Java-programa, un -URL file:// se devuelve que es completamente bien para construir un File.

Conozco la clase FileLocator del Eclipse SDK (que resuelve bundleresource-URLs a URLs de archivo), pero no puedo usarlo en la biblioteca porque no quiero vincularlo a la plataforma Eclipse RCP. debería ser posible usar esta lib de fuentes que no sean Eclipse-RCP también.

Alguien alguna idea sobre cómo puedo cargar este recurso desde una ruta relativa de una manera que funcione tanto cuando se llama al método desde un Eclipse RCP-Plugin o cualquier otro cliente?

Necesito construir un File en el directorio de esta ruta relativa para buscar archivos dentro. Estoy completamente atascado en este ...

ACTUALIZACIÓN: Si existe la posibilidad de que no sea usando File#list() para obtener el contenido del directorio esto ya me ayudarían ..

ninguna pista muy apreciados,

+0

¿Puede mencionar el código en cuestión? –

+0

@TonnyMadsen Hm, pero básicamente podría ser muy simple: estoy usando this.getClass(). GetResource (relPath) para cargar una ruta dentro de mi classPath. Esto me devuelve un URL de bundleresource: // cuando se hace bajo Eclipse RCP y un archivo: // URL de lo contrario. Al intentar crear un objeto de archivo falla con bundleresource: // URL porque el archivo no admite este protocolo. Como necesito leer el contenido del directorio de "relPath", me veo obligado a usar un archivo ... – quaylar

+0

¿Cómo se convierte la URL a un archivo? –

Respuesta

12

¿No podría simplemente invertir la dependencia? Es decir., El módulo de recuperar el recurso como URL define una interfaz

interface Locator { URL resolve(URL url); } 

y se puede utilizar una implementación por defecto

class StandaloneLocator implements Locator { 
    public URL resolve(URL url) { return url; } 
} 

En caso de Eclipse, este localizador por defecto es para ser reemplazado por

class EclipseLocator implements Locator { 
    public URL resolve(URL url) { return FileLocator.resolve(url); } 
} 

Ahora, su biblioteca no tiene dependencias con Eclipse y aún puede usar FileLocator. Como no obtendrá ningún URL de recurso compartido sin Eclipse, esto debería funcionar.

Saludos, Jens

+0

Ya eludí el problema antes de responder, ¡pero esta es una muy buena idea! Aprecio y podría refactorizarlo la próxima vez :) – quaylar

0

No es posible enumerar los archivos en el archivo jar con métodos del Class. O necesita crear el archivo resourcelist que contendrá todos los nombres de sus recursos, o abrir el archivo jar como archivo zip y enumerar archivos como en el archivo zip. La clase File no puede manejar protocolos que no sean file://. Si su recurso está en archivo jar, debe usar la clase Url y obtener la transmisión usando el método Url.openSteram para obtener el contenido del archivo.

UPD para ejecutar una aplicación java simple: probablemente no lo empaques en un archivo jar, por lo que tus clases y recursos se colocan en el sistema de archivos y no en el archivo. Es por eso que obtienes el protocolo file://. Si empaqueta en un archivo jar, el protocolo no será file://, será jar:// (no estoy seguro sobre el nombre exacto del protocolo).

+0

Apreciar su respuesta, pero el archivo/recurso no está en un contenedor, sino en un directorio dentro del classpath de la aplicación. Con respecto a Url.openStream(): desafortunadamente no es posible leer el contenido del directorio con este método (necesito cargar un directorio como recurso y verificar si hay archivos existentes). – quaylar