2011-06-05 10 views
10

en este momento estoy desarrollando una aplicación web basada en OSGi con Jetty y Equinox (consulte: http://wiki.eclipse.org/Jetty/Tutorial/EclipseRT-Jetty-Starter-Kit). Todo está bien hasta el momento, pero i no puedo obtener acceso a algunos archivos/recursos de mi propio paquete. La ubicación/ruta es "configuration/data/config.csv" y "configuration/data/data.zip". He probado todo:Sin acceso al archivo/recurso de paquete (OSGi)

context.getBundleContext().getBundle().getEntry("config.csv"); 
context.getBundleContext().getBundle().getResource("config.csv"); 
this.getClass().getClassLoader().getResource("config.csv"); 
context.getBundleContext().getDataFile("config.csv"); 

Y por supuesto, todos los caminos posibles variantes como: "Configuración/datos/config.csv", "/configuration/data/config.csv", "\ Configuración/datos/config .csv "," /config.csv ". Además he añadido las carpetas a la ruta de clase OSGi (en MANIFEST.MF):

Bundle-ClassPath: ., 
configuration/data/ 

La URL resultante es siempre algo como este (o nulo): "Configuración/CBR-Data/config.csv" y cuando lo transfiero a un objeto de archivo "D: \ configuration \ CBR-Data \ config.csv".

pero lo que realmente no entiendo es que el archivo de propiedades para uno de mis DS se carga a la perfección:
<properties entry="configuration/dsconfig.properties"/>

tiene a alguien una idea/consejo o alguna otra cosa? Me estoy volviendo loco ...

+0

Puede publicar el código, que obtiene la URL del recurso y cómo lo está utilizando después. Cuando use getEntry() debe pasar "configuration/data/config.csv" como parámetro a getEntry(). La URL resultante tendrá el formato: bundleentry: //20.fwk1235/resource.txt. Parece imposible que tenga el formato que ha publicado. Entonces, hay algo que va uno, lo cual no está claro en tu pregunta. –

+0

Tienes razón, lo siento. La salida de 'URL configURL = context.getBundleContext(). GetBundle(). GetEntry (" configuration/data/confid.csv ");' es "bundleentry: //6.fwk33311724/configuration/data/config.csv". Intento transformar la URL a un archivo a través de: 'File configFile = new File (configURL.getPath());'. La ruta de salida 'configFile.getAbsolutePath();' es de: "D: \ configuration \ data \ config.csv" – Zitzit

Respuesta

13

Está recuperando correctamente el recurso del paquete. Sugeriré familiarizarme con la diferencia entre getEntry(), getResource() y getDataFile().

Como los métodos devuelven las direcciones URL correctas, esto significa que el recurso está ubicado correctamente y el problema está en cómo leerlos.

Las dos formas de usarlos son:

  1. InputStream abierto desde el URL directamente:

    URL configURL = context.getBundleContext().getBundle().getEntry("configuration/data/config.csv"); 
    if (configURL != null) { 
     InputStream input = configUrl.openStream(); 
     try { 
      // process your input here or in separate method 
     } finally { 
      input.close(); 
     } 
    } 
  1. convertir el URL a File. No se recomienda este enfoque, ya que supone que el paquete se implementa como un directorio (y no en un archivo). Sin embargo, es útil si debe tratar con bibliotecas heredadas que requieren el uso de objetos File. Para convertir a Archivo no puede usar el método URL.getPath(), porque Equinox tiene su propio formato para las URL. Debe usar la clase org.eclipse.core.runtime.FileLocator para resolver a File. El FileLocator.getBundleFile(Bundle) hace exactamente lo que quiere.
+0

Ok, gracias! Algunas preguntas sobre esto: "Sugeriré familiarizarme con la diferencia entre getEntry(), getResource() y getDataFile()" ¿Tiene algunos enlaces/guías/tutoriales donde se describen estas diferencias? Además, existe la posibilidad de insertar automáticamente algunos directores (por ejemplo, "configuración/datos /") en el directorio de configuración de osgi como se hace para "org.eclipse.osgi" ("configuration/org.eclipse.osgi/bundles/XX ")? -> algo así como "configuration/org.mybundle/data/config.csv". – Zitzit

+0

@Zitzit - No conozco ninguna guía de este tipo, me baso principalmente en la API de OSGi javadoc (http://www.osgi.org/javadoc/r4v43/), donde se explica detalladamente lo que hace cada método . ¿Por qué querría insertar algunos directorios en el directorio de configuración de osgi (que supongo que es la configuración/carpeta de Equinox)? Esta carpeta es específica de Equinox, por lo que su uso debe ser limitado; de lo contrario, usted se volverá dependiente de Equinox. –

4

Resuelto !!! ¡Gracias a Danail Nachev (ver comentario) que me trajo al camino correcto! Después de buscar después de "bundleentry: // XYZ" y "bundleresource: //" me encontré con este post lista de correo: http://www.mail-archive.com/[email protected]/msg02410.html

Así que la respuesta es la siguiente (Usging (Equinox) FileLocator):

URL configURL = context.getBundleContext().getBundle().getResource("config.csv"); 
File configFile = new File(FileLocator.toFileURL(configURL).getPath()); 

Pero (también se preguntó en esa lista de correo) sería interesante si existen otras soluciones que no solo sean aplicables para Equinox.

+0

Sería mejor si votara la respuesta de Danail Nachev. Además, en lugar de agregar otra respuesta a su pregunta que indique cuál es la solución, sería mejor si editó su pregunta original y agregó la solución debajo de la pregunta. – jfenwick

+0

http://stackoverflow.com/questions/4538898/map-with-string-is-brokensolved Aquí hay un buen ejemplo de cómo cambiar su pregunta para que sea más fácil encontrar la solución. – jfenwick

+0

@jfenwick - Me pregunto por qué piensas eso. http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ explícitamente dice que responder la pregunta usted mismo es lo correcto. –

Cuestiones relacionadas