2010-08-19 20 views
13

He creado dos paquetes OSGI A y B usando el asistente del proyecto del complemento eclipse (usando eclipse Helios).¿Tiene acceso a recursos en otro paquete de osgi?

En el archivo de manifiesto del paquete B, he agregado el paquete A como una dependencia. Además, he exportado los paquetes en A para que sean visibles para B. También tengo un archivo .properties en el paquete A que me gustaría hacer visible para el paquete B. En el panel build.properties en el paquete AI he especificado:

source.. = src/ 
bin.includes = META-INF/,\ 
       .,\ 
       bundle_A.properties 

Ahora en paquete intento de BI para cargar el archivo .properties usando:

Pero eso da una excepción NullPointer (el archivo no se encuentra en la ruta de clase).

¿Es posible exportar recursos del paquete A (como cuando exporta paquetes) o acceder de alguna manera al archivo en A desde B de otra manera (accediendo al cargador de clases para el paquete A del paquete B)?

Respuesta

3

Si estás escribiendo un Eclipse plug-in que podría intentar algo como:

Bundle bundle = Platform.getBundle("your.plugin.id"); 

Path path = new Path("path/to/a/file.type"); 

URL fileURL = Platform.find(bundle, path); 

InputStream in = fileURL.openStream(); 
+0

Esto aparentemente está en desuso en Helios. – JRSofty

2

¿Ha considerado agregar un método para agrupar la API de A que carga y devuelve el recurso?

Muchos podrían considerar esto un mejor diseño, ya que permite el nombre o el medio de almacenamiento del recurso de cambiar sin romper los clientes del paquete A.

+0

Ese enfoque funciona cuando ejecuto la prueba del complemento. Pero cuando ejecuto el paquete a través de la configuración de inicio, no se puede encontrar el archivo .properties. ¿Cuál es la diferencia entre configurar una prueba de plugin y la configuración de ejecución de OSGI? – u123

1

¿Ha intentado utilizar el BundleContext del paquete de A a cargar los recursos?

+0

Jep y eso funciona bien, estoy confundido por qué no es posible cargar un recurso de otro paquete usando, por ejemplo: this.getClass(). GetClassLoader(). GetResourceAsStream ( "bundle_A.properties"); cuando el paquete se especifica como una dependencia y el archivo .properties se encuentra en un paquete que se exporta. – u123

+0

Porque 'this' está en el paquete A. Usa una clase del Bundle B y funciona. –

15

El método getEntry(String) en Bundle está destinado a este fin. Puede usarlo para cargar cualquier recurso de cualquier paquete. También vea los métodos findEntries() y getEntryPaths() si no conoce la ruta exacta al recurso dentro del paquete.

No es necesario obtener el cargador de clases del paquete para hacerlo.

+1

También tenga en cuenta que no es necesario exportar el paquete que contiene los recursos del paquete A. –

0

Probar con /; si no pone /, el cargador de clases intentará cargar el recurso del mismo paquete.

this.getClass().getClassLoader().getResourceAsStream("/bundle_A.properties") 
+0

Esto es incorrecto. Solo usará el cargador de clases del paquete B para encontrar el recurso que no está visible para agrupar el cargador de clases de B –

Cuestiones relacionadas