2009-02-18 14 views
10

Bir Eclipse RCP uygulamasına yeni başladım, temel olarak sadece "merhaba dünya" örneklerinden biri.Bir Eclipse RCP uygulaması için OSGi BundleContext'i nasıl alabilirim?

Uygulama başlatıldığında, komut satırı parametrelerime bakmak ve bunlara göre bazı hizmetler başlatmak istiyorum.

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

Ama hizmetlerini kayıt böylece nasıl BundleContext, alabilirim: Ben IApplication.start komut satırı parametreleri alabilirim? IApplicationContext içinde görünmüyor.

cevap

12

Tricky iç yolu:

InternalPlatform.getDefault().getBundleContext() 

bunu yapabilir.

Sen 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 bir örnek bulacaksınız:

Her plug-in kendi paket içeriğine erişimi vardır.

Eklenti sınıfınızın, start(BundleContext) yöntemini geçersiz kıldığından emin olun. Daha sonra eklentinizdeki bir yer sınıfına kaydedebilirsiniz.

Bir eklentiye sağlanan paket içeriği ona özgüdür ve asla başka eklentilerle paylaşılmamalıdır.

+0

Ancak "başlangıç" yönteminin kendisi bir paket bağlamı gerektirir: Bunu BundleActivator'nuzu beslemek için nereye koyarsınız? Bunu FrameworkUtil'den alabilirim ama bu (benim durumumda) 'null' yani ... Aksi takdirde aktivatörünüzü MANIFEST'te ilan edersiniz, böylece bir paket bağlamı elde ederim .. ama buna nasıl verildi? :) – Campa

+0

@Campa emin değil: 6+ yıl önceydi ve artık bu tür bir projeye erişimim yok. Bununla ilgili bir bağlantıyla yeni bir soru sorabilirsin. – VonC

14

Sadece bir web araması yaparak karşılaştım ve yeni standart OSGi R4.2 yolunu tanıtacağımı düşündüm (Eclipse 3.5 ile birlikte gönderilen Equinox tarafından sağlanan). Bir etkinleştiriciniz yoksa ve paket içeriğini önbelleğe almak için bir tane oluşturmak istemiyorsanız, FrameworkUtil.getBundle'ı kullanabilirsiniz. Önceki örneği değiştirme:

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

Burada dikkat, bazı OSGi uygulamalarında paket için içerik bağlamı olmayabilir. Orada olması gerekmiyor. –

+0

@Francis: İşte şanslı olan! Grubumda bağlam yok (null). Diğer alternatifler? (İçsel zorlu korsanlar iyi değil) – Campa

+0

Görünüşe göre, bir “Bundle-Activator” i bildiren bir eklentinin kendi bağlamı belirlenir, aksi halde “FrameworkUtil” yolu “null” değerini döndürür. – Campa

İlgili konular