2010-09-28 12 views
11

Estoy usando el conjunto de herramientas aQute Bnd para crear un paquete OSGi y he empaquetado con algunos archivos dependientes de 'recursos'. Esto incluye archivos * .css y * .xsd en un directorio de recursos que he creado.Cómo hacer referencia a un archivo incluido en el paquete OSGi al ejecutar java.io.File o FileInputStream

he incluido lo siguiente en el bundle.bnd archivo:

Include-Resource: resources/=resources/ 

y cuando lo haga la acumulación, la generada * .jar tiene las Css * * y archivos en el .xsd directorio de recursos en el directorio superior del archivo del paquete jar.

Sin embargo, en el código real Tengo dificultades al tratar de hacer referencia a esto como parte de mi trayectoria de la clase:

He intentado lo siguiente:

new File("resources/example.css"); 

También he intentado:

URL cssFile = this.getClass().getResource("resources/example.css"); 
try 
{ 
    file = new File(cssFile.toURI())); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

O bien obtengo un error NullPointException o no se puede encontrar un archivo Error IOException (dependiendo de cuál use). Recibo este error al ejecutar tanto en Eclipse Equinox en modo de configuración de depuración como en Apache Felix (que estamos utilizando para nuestra implementación). Tenga en cuenta que estoy tratando de hacer esto en clases de Java fuera del BundleActivator.

¿Necesito siempre referirme al contexto del BundleActivator, por ejemplo?

/* 
* (non-Javadoc) 
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) 
*/ 
@Override 
public void start(BundleContext context) throws Exception 
{ 
    /* Service to host the Bundle interface. */ 
    ServletContainerService service = new ServletContainerService(); 
    service.addServlet(new ServletContainer(new AxisServlet(), true)); 
    this.serverReg = context.registerService(ServletContainerService.class.getName(), service, null); 

    cssFile = new File(context.getClass.getResource("resource/example.css")); 
} 

creo que lo anterior va a funcionar, pero significará que tendrá que pasar la referencia cssFile alrededor de la cual no parece ser elegante.

¿Hay alguna manera de referirse a la ruta del directorio 'resources' que se incluye en el archivo jar del paquete en cualquier clase Java dada que es parte del paquete/archivo .jar? Si se trata de BundleContext, ¿hay alguna manera de hacer referencia a esto en cualquier clase de Java?

Cualquier ayuda será muy apreciada.


he tenido un vistazo a y Including additional resources with OSGi bundles pero parece que necesita el BundleContext.

que podría haber encontrado una posible solución a este: http://www.vogella.de/blog/tag/plugin/

Parece que Vogella tiene un código de ejemplo para esto:

URL url; 
try { 
     url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt"); 
    InputStream inputStream = url.openConnection().getInputStream(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); 
    String inputLine; 

    while ((inputLine = in.readLine()) != null) { 
     System.out.println(inputLine); 
    } 

    in.close(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

¿Alguien sabe si este camino es el mismo si no es un complemento y si estoy usando diferentes entornos OSGi, por ejemplo. Equinox Eclipse vs. Apache Felix? p. url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");

Respuesta

9

El Bundle interface tiene un método getEntry(java.lang.String path) el cual devuelve un URL y se documenta como:

Devuelve una URL para la entrada en la ruta especificada en este paquete. El cargador de clases de este paquete no se usa para buscar la entrada. Solo se busca la entrada en el contenido de este paquete. La ruta especificada es siempre relativa a la raíz de este paquete y puede comenzar con "/".Un valor de ruta de "/" indica la raíz de este paquete.

+0

¿Hay alguna forma de acceder a él fuera del contexto de la BundleActivator? Supongo que se refiere a hacer algo como esto: public void start (contexto BundleContext) { Paquete de paquetes = context.getBundle(); InputStream in = bundle.getEntry ("/ resource/example.css"). OpenStream(); }. Sin embargo, estoy buscando una solución (si la hay) para acceder a ella fuera del BundleActivator. He echado un vistazo a http://www.eclipsezone.com/eclipse/forums/t101557.html pero todavía estoy confundido – herbyme

+0

¿Has visto una forma de obtener un objeto Bundle del ID del paquete? –

+0

Puedo obtener la entrada, pero el problema es que getEntry() solo proporciona la ruta relativa, y no la ruta completa (raíz) del paquete: http://www.techinfopad.com/spring/101600333-getting-root -path-of-a-bundle.html. – herbyme

2

Si usted está construyendo con Eclipse/Equinox, entonces se puede obtener la ubicación de un paquete general fuera de la BundleContext contenida dentro de la BundleActivator llamando a algo como:

Bundle yourBundle = Platform.getBundle("bundleSymbolicName"); 
Path relativePathToBundle = new Path("/relativePath"); 
FileLocator.openStream(yourBundle, relativePathToBundle, false); 

la plataforma y clases FileLocator provienen de el complemento org.eclipse.core.runtime, de modo que si tiene una dependencia de eso, lo anterior debería permitirle acceder a su recurso.

+0

Estoy tratando de evitar el uso del complemento org.eclipse.core.runtime en cuanto a nuestro despliegue, la decisión fue tomar el uso de Apache Félix (a menos que haya una forma de incorporar esto). Lo anterior funciona si lo ejecuto en el entorno de tiempo de ejecución de Eclipse. – herbyme

3

Creo que la respuesta debe ser tan simple como la siguiente:

URL cssFile = this.getClass().getResource("/resources/example.css"); 

es decir, asegúrese de que haya una barra diagonal en el camino. Lo tenía sin una barra diagonal, lo que lo haría "relativo" a la clase desde la que está llamando.

Alternativamente, el siguiente debe funcionar:

this.getClass().getClassLoader().getResource("resources/example.css"); 
+0

Opté por esta solución, pero tuve problemas para tratar de importar todos los valores del directorio, p. Estoy usando BluePrint CSS y tuve problemas con this.getClass(). GetClassLoader(). GetResource ("resources/css") porque no solo hay muchos archivos, sino también subdirectorios. Terminé 'copiando' los archivos en una ubicación temporal, pero esto provoca algunos problemas de rendimiento. – herbyme

Cuestiones relacionadas