2009-02-18 19 views
10

Acabo de comenzar con una aplicación Eclipse RCP, es básicamente una de las muestras proporcionadas de "hello world".¿Cómo obtengo OSGi BundleContext para una aplicación Eclipse RCP?

Cuando la aplicación se inicia, me gustaría ver mis parámetros de línea de comandos y comenzar algunos servicios según ellos. Puedo conseguir los parámetros de línea de comandos en IApplication.start:

public Object start(IApplicationContext context) { 
    String[] argv = (String[]) 
     context.getArguments().get(IApplicationContext.APPLICATION_ARGS))); 
} 

Pero ¿cómo puedo obtener el BundleContext, de modo que pueda inscribirse servicios? No parece estar en IApplicationContext.

Respuesta

12

manera interna difícil:

InternalPlatform.getDefault().getBundleContext() 

podría hacerlo.

Va a encontrar un ejemplo en this class

public class ExportClassDigestApplication implements IApplication { 

    public Object start(IApplicationContext context) throws Exception { 
     context.applicationRunning(); 

     List<ExtensionBean> extensionBeans = ImpCoreUtil.loadExtensionBeans(&quot;com.xab.core.containerlaunchers&quot;); 
     for (ExtensionBean bean : extensionBeans) { 
      ILauncher launcher = (ILauncher) bean.getInstance(); 
      launcher.start(); 
     } 
     ClassFilter classFilter = new ClassFilter() { 
      public boolean isClassAccepted(Class clz) { 
       return true; 
      } 
     }; 

     PrintWriter writer = new PrintWriter(new File("C:/classes.csv")); 

     Bundle[] bundles = InternalPlatform.getDefault().getBundleContext().getBundles(); 

Proper way:

Cada plug-in tiene acceso a su propio contexto paquete.

Solo asegúrese de que su clase de complemento anule el método start(BundleContext). A continuación, puede guardarlo en un lugar. Las clases de su complemento pueden acceder fácilmente al

. Tenga en cuenta que el contexto del paquete proporcionado a un complemento es específico y nunca debe compartirse con otros complementos.

+0

Pero el método 'start' requiere un contexto de paquete: ¿dónde tomarías eso para alimentar tu' BundleActivator'? Puedo tomarlo de 'FrameworkUtil' pero eso (en mi caso) es' nulo' así que ... De lo contrario, declaras tu activador en MANIFEST, así que obtengo un contexto de paquete ... pero ¿cómo se le dio? :) – Campa

+0

@Campa no estoy seguro: eso fue hace más de 6 años, y ya no tengo acceso a ese tipo de proyecto. Sin embargo, puede hacer una nueva pregunta con un enlace a este. – VonC

14

Acabo de encontrar esto haciendo una búsqueda en la web, y pensé que promocionaría el nuevo estándar OSGi R4.2 (provisto por Equinox incluido con Eclipse 3.5). Si no tiene un activador y no desea crear uno solo para almacenar en caché el contexto del paquete, puede usar FrameworkUtil.getBundle. Modificando el ejemplo anterior:

import org.osgi.framework.FrameworkUtil; 

public class ExportClassDigestApplication implements IApplication { 
    public Object start(IApplicationContext context) throws Exception { 
     context.applicationRunning(); 
     BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()) 
                .getBundleContext(); 
    } 
} 
+2

Precaución aquí, el contexto del paquete puede no existir para el paquete en algunas implementaciones OSGi. No es obligatorio estar allí. –

+0

@Francis: ¡Aquí hay un afortunado! Mi paquete no proporciona contexto ('null'). Otras alternativas? (Los trucos internos no son buenos) – Campa

+0

Parece que un complemento que declara un 'Bundle-Activator' tendrá su contexto establecido, de lo contrario' FrameworkUtil'-way devolverá 'null'. – Campa

Cuestiones relacionadas