2012-03-12 31 views
9

Tôi phát triển một ứng dụng RCP Eclipse, sử dụng nhiều gói OSGi cung cấp các dịch vụ để sử dụng sau này. Trường hợp sử dụng yêu cầu các gói đăng ký dịch vụ của họ (ví dụ: bộ lọc nhập) sẽ được sử dụng sau này trong các tình huống khác nhau. Các gói OSGi được xây dựng với maven-bundle-plugin.Cách tự động khởi động/háo hức khởi động các dịch vụ OSGi trên nền tảng Eclipse

Làm thế nào tôi có thể yêu cầu Equinox tự động bắt đầu các gói OSGi? Cách tiếp cận thông thường thông qua Activator không hoạt động. Chỉ chế độ lười biếng đang hoạt động, nhưng tôi không thể chạm vào các lớp trong các gói không xác định. Tôi đọc đặc tả OSGi và ngược lại với tải lười, tải háo hức, không được cung cấp. Có cơ hội khác để đánh dấu gói cho tải tự động không?

Trong Eclipse tôi có cơ hội đặt Tự động bắt đầu thành sự thật, nhưng tôi phải làm gì trong bản dựng phân phối của Maven và Tycho?

Dịch vụ khai báo không hoạt động do vấn đề không được tải org.eclipse.equinox.ds. Tôi có thể làm cho nó bắt đầu bằng cách nào đó thay vì một Activator? Đây cũng là một giải pháp, nhưng tôi không biết cách xây dựng bản phân phối hoặc những gì để đặt làm cấu hình.

thực hành tốt nhất là gì đây? Có khả năng nào khác không? Tài liệu về các gói OSGi trên nền tảng Eclipse hơi mỏng.

+1

Tôi không biết về maven/tycho. Nhưng nếu bạn sử dụng kịch bản lệnh pde ant, nó sử dụng 'config.ini' để điều khiển tự động khởi động. Kiểm tra 'config.ini' đã tạo trong' workspace \ .metadata \ .plugins \ org.eclipse.pde.core \ your-rcp-product-name.product'. –

+1

xem http://software.2206966.n2.nabble.com/tycho-generated-config-ini-does-not-start-runtime-td6077893.html –

Trả lời

4

Bạn đang đi đúng hướng với các dịch vụ khai báo. Đăng ký dịch vụ của bạn theo cách thủ công là rất nhiều công việc khó khăn, và tìm kiếm chúng một cách an toàn có thể làm việc nhiều hơn, và khó khăn để có được quyền. Một tiêu chuẩn khác trong lĩnh vực này cần lưu ý là Blueprint, mặc dù tôi chắc chắn không đề nghị bạn viết lại bất cứ điều gì nếu bạn có siêu dữ liệu DS tại chỗ. Kế hoạch chi tiết có đặc điểm đẹp hơn một chút trong môi trường rất năng động và cấu hình phong phú hơn. (Tôi là người bắt đầu một trong những triển khai Blueprint, Apache Aries.) Với cả Blueprint và DS, điều quan trọng là một thứ khác đang quản lý các dịch vụ của bạn cho bạn.

Điều này khiến chúng tôi trở lại với vấn đề tại sao các gói của bạn không được bắt đầu. Tôi nghĩ rằng phải có một đầu mối trong thực tế là họ bắt đầu ở Felix. Bạn đã bắn lên một bảng điều khiển cân bằng và xác nhận tất cả các gói của bạn đã được cài đặt và giải quyết chưa? ('ss' để liệt kê các gói.) Bạn đã có một cái nhìn trong tệp config.ini và xác nhận các gói của bạn được liệt kê và với mức bắt đầu thích hợp - hoặc bạn đang sử dụng gói tự động bắt đầu-mọi thứ Equinox?

+0

Có, tôi sẽ thử các dịch vụ khai báo tiếp theo. Tôi sẽ nói sau. –

+0

Vì vậy, nó đã được làm việc. Tôi để DS bắt đầu trong thời gian chạy và để khai báo các dịch vụ thông qua XML. Các dịch vụ trước đây đã được giải quyết và không bắt đầu. Làm thế nào tôi có thể ảnh hưởng đến điều đó, tôi không biết. Nhưng DS đang làm việc. –

0

MANIFEST.MF có này:

Bundle-ActivationPolicy: lazy 

Điều này có thể cũng hữu ích:

http://wiki.eclipse.org/Lazy_Start_Bundles#Should_I_change_to_the_new_Bundle-ActivationPolicy_Header.3F

Tuy nhiên tôi sẽ nói rằng tôi sẽ cố gắng dựa vào kích hoạt OSGi càng nhiều càng tốt. Nếu không có cách nào khác để giải quyết vấn đề của bạn, thì liên kết trước đó có thể hữu ích.

+2

Để tải chậm ứng dụng của tôi cần biết về các gói được kích hoạt . Điều này là không muốn và không phải là một thiết kế tốt. Đây là lý do tại sao tôi đã xóa tải chậm. Trong Felix bó của tôi được kích hoạt chính xác. Chỉ Equinox gây rắc rối. Những gì tôi cần là 'Bundle-ActivationPolicy: auto', nhưng điều này không được hỗ trợ. –

5

Bạn có thể sử dụng điểm mở rộng "org.eclipse.ui.startup" trong plugin của mình. Điều này cho phép bạn chỉ định một lớp IStartup sẽ được gọi khi giao diện người dùng Eclipse khởi động. Miễn là đây là một lớp trong nhóm của bạn thì gói của bạn sẽ được bắt đầu. Nó có nghĩa là bao gồm một tệp plugin.xml và điều này sẽ cụ thể là một plugin Eclipse chứ không phải là một gói OSGi tiêu chuẩn, nhưng sau đó bạn có thể sử dụng plugin này để kích hoạt bất kỳ gói OSGi chuẩn nào của bạn.

+0

Một số gói mà tôi sử dụng là khá chung chung và tôi không muốn làm cho chúng trở thành các plugin bổ sung. Tôi biết, nó không phải là một vấn đề để bó một plugin.xml và các tập tin khác vào bình, nhưng tôi nghĩ rằng nó không thực sự sạch sẽ. Đề nghị của bạn là tốt và tôi nghĩ rằng nó sẽ làm việc, nhưng nó là sự lựa chọn cuối cùng của tôi, tôi nghĩ. Dù sao cũng cảm ơn bạn! –

+0

Tôi không nghĩ rằng cần phải sửa đổi các gói hiện tại của bạn. Plugin Eclipse có thể chỉ đơn giản là một gói mới với công việc duy nhất là đảm bảo rằng gói DS đã bắt đầu, theo cách đó tất cả các dịch vụ khai báo của bạn sẽ được tìm thấy. Điều này tránh phải chỉ định các gói khởi động trong tệp config.ini. –

8

Thở dài. Bạn là nạn nhân của một chiến lược sai lầm trong Eclipse để ngăn chặn các lập trình viên (câm) mở rộng thời gian khởi động. Thay vì cảnh báo, họ chỉ quyết định không bắt đầu các gói.Điều này trái ngược với những gì OSGi đề nghị :-(Một bó chỉ có thể được kích hoạt (chúng về cơ bản bị mất hiệu lực) khi ai đó nạp một lớp từ nó (đây là kích hoạt lười biếng là gì.)

Giải pháp tốt nhất là Bạn có thể khai báo các dịch vụ ngay lập tức, các dịch vụ này sẽ được kích hoạt khi khởi động, và bạn có thể khai báo các dịch vụ lười, được kích hoạt khi được sử dụng. yêu cầu ngay lập tức, như ví dụ một máy chủ cung cấp dịch vụ đó trên internet bạn phải chắc chắn trong config.ini của bạn mà DS được bắt đầu

+0

Vâng, tôi đã đọc về các loại phô mai khác nhau. Tôi thích và hỗ trợ tải chậm, nhưng như bạn đã đề cập: Một số thiết kế cần tải tự động để đăng ký dịch vụ (mẫu bảng trắng). Tôi sẽ thử các dịch vụ khai báo. –

+0

Như bạn đã nói, Eclipse bình thường sẽ không bắt đầu bất kỳ gói nào trừ khi được liệt kê rõ ràng trong cấu hình hoặc nó sử dụng kích hoạt lười biếng và có một lớp được nạp bởi một số gói khác. Đây là vấn đề đối với DS khi các gói đã ngừng/đã cài đặt bị bỏ qua. Tuy nhiên, tôi đã nhận thấy rằng Service Equinox Component Runtime có một tính năng ẩn: nếu bạn khai báo gói của mình là lazy-loading và thành phần của bạn được đánh dấu là "ngay lập tức", SCR sẽ bắt đầu gói * của bạn * (rất có thể vì SCR con số rằng nếu không ai bắt đầu nó, không ai khác sẽ). Chưa có ý tưởng về hành vi không trực tiếp. – JBert

0

bạn có thể thêm video này vào .product tập tin của bạn:..

Cách khác, mở tệp .product trong Eclipse và chuyển đến tab Cấu hình và thêm plugin với cấp bắt đầu mong muốn tại đó.

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