2011-12-15 33 views
6

Tôi đang cố gắng viết một ứng dụng máy tính để bàn dựa trên OSGi. Tôi có một Swing JFrame và tôi muốn thêm khả năng để thêm các mô-đun (các gói khác). Tôi đã đi qua EclipseZone OSGi at JSig tutorial, nhưng mọi ứng dụng đều bắt đầu từ Khung OSGi (trong trường hợp này là Knopflerfish OSGi Desktop).Sử dụng OSGi trong ứng dụng độc lập trên máy tính để bàn

Vì vậy, câu hỏi của tôi là, cho dù có một tùy chọn để khởi động ứng dụng mà không có khung OSGi hiển thị? Tôi knwo, rằng từ mã, nó có thể thay đổi thuộc tính của một bó, nhưng làm thế nào để thay đổi các thuộc tính của một khuôn khổ theo cách đó? (Ví dụ mặc định vị trí bó lưu trữ, hành động mặc định khi bó là ở vị trí vv?)

public class MainFrame extends ServiceTracker implements BundleActivator { 

    public MainFrame(BundleContext context, JToolBar toolBar) { 
     // select, which services is the bundle tracking 
     super(context, JMenu.class.getName(), null); 
    } 

    @Override 
    public void start(BundleContext context) throws Exception { 
     //display a JFrame 
    } 

    @Override 
    public void stop(BundleContext context) throws Exception { 
     //hide a JFrame 
    } 

    @Override 
    public Object addingService(ServiceReference reference) { 
     // Process a Service and return a JMenu 
     return new JMenu(); 
    } 

    @Override 
    public void removedService(ServiceReference reference, Object service) { 
     // remove a JMenu from a JFrame 
    } 

    public static void main(String[] args) { 
     // ???????????????????????????????????????????? 
     // ???????????????????????????????????????????? 
    } 
} 

Tôi đã viết một lớp trên (tôi đã đăng chỉ là một phác thảo), nhưng tôi không có ý tưởng, những gì để viết vào một hàm main(). Gói này hoạt động tốt trong Desktop Knopflerfish OSGi, nhưng tôi muốn nó chạy mà không có nó.

Trả lời

12

Mã của bạn về cơ bản là ổn, nhưng có vẻ như bạn muốn kiểm soát nhiều hơn khuôn khổ OSGi chính nó. Nói cách khác, bạn muốn biết cách khởi chạy một khung công tác OSGi và bắt đầu gói của bạn. Vấn đề hiện tại là bạn đang sử dụng trình khởi chạy của người khác (trình khởi chạy Knopflerfish) bao gồm Bảng điều khiển GUI KF và bạn đang sử dụng trình cài đặt đó để bắt đầu gói của mình. Tuy nhiên không ai trong số đó là cần thiết.

Trong câu trả lời của AValchev, ông nói về việc bắt đầu Equinox với java -jar org.eclipse.osgi.jar -console. Vấn đề với cách tiếp cận đó là nó cung cấp cho bạn khung làm việc OS2 trống, vì vậy bạn sẽ phải nhập lệnh vào vỏ OSGi để cài đặt và bắt đầu gói của bạn ... cũng không lý tưởng!

Tôi nghĩ bạn nên viết trình chạy của riêng bạn. Điều này thực sự rất đơn giản và có thể được thực hiện theo cách hoàn toàn độc lập với bất kỳ khung công tác OSGi cụ thể nào. Tôi đã viết về điều này trong một số blog post một thời gian ngắn trước đây.

Trong pseudo-code, ứng dụng launcher của bạn sẽ giống như thế này:

public static void main() { 

    1. get a FrameworkFactory using java.util.ServiceLoader. 
    2. create an OSGi framework using the FrameworkFactory 
    3. start the OSGi framework 
    4. Install your bundle(s). 
    5. Start all the bundles you installed. 
    6. Wait for the OSGi framework to shutdown. 

} 

Trong câu hỏi của bạn, bạn đặc biệt yêu cầu về thiết lập vị trí bó lưu trữ. Điều này có thể được thực hiện bằng cách đặt thuộc tính Constants.FRAMEWORK_STORAGE trong Bản đồ mà bạn chuyển vào phương thức FrameworkFactory.newFramework.

+0

Cảm ơn! Bản thân bài đăng trên blog thực sự đã giải quyết nó. – Benjamin

+0

liên kết bài đăng trên blog bị hỏng. –

1

Nếu bạn muốn sử dụng các thành phần Swing, bạn không cần bàn làm việc OSOP Knopflerfish. Chỉ cần tải xuống Bộ khởi động EclipseRT và đặt các plugin của bạn ở đó.

Một cách rất đơn giản của việc sử dụng OSGi là:

java -jar org.eclipse.osgi.jar -console 

Với lệnh này bạn đã bắt đầu phân và bạn có thể cài đặt các nhóm của bạn từ bàn điều khiển.

Bạn có thể tìm thấy rất tốt hướng dẫn here

Trong trường hợp của bạn chỉ cần đặt JFrame initalzation trong start() phương pháp:

@Override 
public void start(BundleContext context) throws Exception { 
    JFrame jf = new JFrame(); 
    ..... 
} 
-2

Tôi không chắc chắn chính xác những gì bạn muốn làm, nhưng nếu bạn đang tìm kiếm một cách mô-đun để viết các ứng dụng Swing sau đó có một cái nhìn tại nền tảng NetBeans. Hệ thống mô-đun lõi không phải là OSGi nhưng nó có thể "nói chuyện" với các mô-đun OSGi nếu cần.

1

Eclipse RCP là một tùy chọn tốt để viết ứng dụng khách. Nó hoàn toàn dựa trên OSGi, và cung cấp một bộ công cụ phong phú cho lập trình UI. Eclipse cũng cung cấp môi trường phát triển để xây dựng chúng.

Khi được xây dựng, bạn sẽ có một ứng dụng độc lập chỉ xảy ra dựa trên OSGi, nhưng không yêu cầu tương tác với OSGi để chạy, đó là điều tôi tin rằng bạn đang cố gắng hoàn thành.

Eclipse RCP Tutorial

Các vấn đề liên quan