2009-02-18 10 views
10

Tôi vừa mới bắt đầu với một ứng dụng RCP Eclipse, về cơ bản nó chỉ là một trong những mẫu "hello world" được cung cấp.Làm cách nào để có được BundleContext OSGi cho một ứng dụng RCP Eclipse?

Khi ứng dụng khởi động, tôi muốn xem các tham số dòng lệnh của mình và bắt đầu một số dịch vụ theo chúng. Tôi có thể lấy các thông số dòng lệnh trong IApplication.start:

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

Nhưng làm thế nào để tôi có được BundleContext, vì vậy mà tôi có thể đăng ký dịch vụ? Nó dường như không có trong IApplicationContext.

Trả lời

12

Tricky cách nội bộ:

InternalPlatform.getDefault().getBundleContext() 

có thể làm điều đó.

Bạn sẽ tìm thấy một ví dụ trong 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:

Mỗi plug-in có quyền truy cập vào bó bối cảnh riêng của mình.

Chỉ cần đảm bảo lớp trình cắm của bạn ghi đè phương thức start(BundleContext). Sau đó bạn có thể lưu nó vào một lớp địa điểm trong trình cắm của bạn có thể dễ dàng truy cập

Lưu ý ngữ cảnh của gói được cung cấp cho trình cắm cụ thể và không bao giờ được chia sẻ với các trình cắm khác.

+0

Nhưng chính phương thức 'bắt đầu' yêu cầu ngữ cảnh gói: bạn sẽ lấy nó ở đâu để nuôi' BundleActivator'? Tôi có thể lấy nó từ 'FrameworkUtil' nhưng điều đó (trong trường hợp của tôi) là' null' vì vậy ... Nếu không, bạn khai báo trình kích hoạt của bạn trong MANIFEST, vì vậy tôi nhận được một bối cảnh bó .. nhưng nó được trao cho nó như thế nào? :) – Campa

+0

@Campa không chắc chắn: đó là cách đây hơn 6 năm và tôi không có quyền truy cập vào loại dự án đó nữa. Bạn có thể đặt một câu hỏi mới với một liên kết quay lại câu hỏi này. – VonC

14

Chỉ cần thực hiện điều này khi thực hiện tìm kiếm trên web và nghĩ tôi sẽ quảng bá cách OSGi R4.2 chuẩn mới (theo Equinox được chuyển với Eclipse 3.5). Nếu bạn không có trình kích hoạt và không muốn tạo một trình kích hoạt để lưu trữ bối cảnh gói, bạn có thể sử dụng FrameworkUtil.getBundle. Sửa đổi ví dụ trước:

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

Thận trọng ở đây, ngữ cảnh gói có thể không tồn tại cho gói trong một số triển khai OSGi. Nó không bắt buộc phải có mặt ở đó. –

+0

@Francis: Đây là một may mắn! Gói của tôi không cung cấp ngữ cảnh ('null'). Các lựa chọn thay thế khác? (Hack nội bộ khôn lanh là tốt không) – Campa

+0

Có vẻ như một plugin tuyên bố một 'Bundle-Activator' sẽ có bối cảnh của nó được thiết lập, nếu không' FrameworkUtil'-way sẽ trả về 'null'. – Campa