2011-02-08 37 views
12

Có thể sử dụng thư viện không phải osgi với ứng dụng OSGi không?Sử dụng thư viện không phải osgi trong ứng dụng osgi

Ví dụ, tôi đang phát triển một công cụ tìm kiếm dựa trên ngữ nghĩa và tôi đang sử dụng thư viện Xử lý ngôn ngữ tự nhiên của bên thứ ba cho nó (http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor).

Có thể giao tiếp một thư viện không hỗ trợ OSGi, như một vài tệp jar, với ứng dụng OSGi của tôi không?

Trả lời

22

Vì nó được viết bằng câu trả lời trước bạn có hai lựa chọn nếu bạn muốn sử dụng các thư viện bổ sung trong các nhóm của bạn:

  1. nhúng lọ thư viện trong một gói, trong đó nó sẽ được sử dụng,
  2. tạo gói OSGi hợp lệ từ thư viện.

Các tiếp cận đầu tiên là đơn giản vì bạn chỉ cần sao chép lọ thư viện (và tất cả phụ thuộc của nó) vào một bó (ví dụ như vào một thư mục root) và sau đó thêm chúng vào Bundle-Classpath phần tử trong MANIFEST.MF (xem here) . Tuy nhiên, trong khi thực hiện điều này, bạn phải nhớ rằng thư viện được thêm vào này sẽ chỉ hiển thị trong một gói mà nó được nhúng (do đó việc sử dụng lại thư viện bị hạn chế). Bạn luôn có thể thêm các gói từ thư viện này vào thành phần Export-package trong MANIFEST.MF để hiển thị các gói này cho các gói khác nhưng điều này vượt xa giải pháp thanh lịch (tuy nhiên nó sẽ hoạt động).

Để hiển thị các gói khác, bạn nên sử dụng cách tiếp cận thứ hai thứ hai, tức là tạo gói OSGi từ thư viện (có các công cụ có thể giúp bạn thực hiện điều đó, cũng như trong Eclipse). Tuy nhiên, đối với các thư viện phức tạp hơn, cách tiếp cận này có thể khó hơn (vì phụ thuộc và cách tiếp cận tải lớp cụ thể trong OSGi).

Vì vậy, nếu bạn chỉ muốn sử dụng thư viện trong một nhóm, tôi khuyên bạn nên sử dụng phương pháp đầu tiên (dễ triển khai hơn). Nếu bạn muốn sử dụng thư viện này trong nhiều gói trong ứng dụng của mình, bạn nên xem xét cách tiếp cận thứ hai.

3

Có, điều đó là có thể. Bạn có hai tùy chọn:

Thứ nhất, bạn có thể bao gồm tất cả các gói từ thư viện bên ngoài vào phần gói riêng tư trong gói của mình. Nó sẽ bao gồm tất cả các gói này vào jar với ứng dụng của bạn. Tùy chọn thứ hai là tạo gói osgi hợp lệ từ thư viện bên ngoài.

5

Có, bạn có thể nhúng thư viện bên ngoài vào gói của bạn hoặc gói ("OSGIfy") thư viện dưới dạng gói OSGi. Đối với cả hai tùy chọn, Pax Construct (http://www.ops4j.org/projects/pax/construct) là một công cụ tốt.

Nếu thư viện bên ngoài của bạn có phụ thuộc, hãy nhúng tất cả các gói này vào một gói hoặc sử dụng Pax Construct để bọc chúng trong suốt.

Nếu phải chọn giữa gói hoặc nhúng, hãy xem xét quản lý phụ thuộc và phiên bản gói. Nếu bạn cần nâng cấp thư viện bên ngoài và nó được nhúng trong gói ứng dụng của riêng bạn, bạn luôn phát hành cả thư viện và mã của riêng bạn. Ví dụ: cũng không thể có 2 phiên bản của thư viện đang hoạt động mà không có 2 phiên bản của gói ứng dụng đang hoạt động. Và cũng ... nếu bạn không làm việc trong môi trường OSGi, bạn có muốn thêm các lớp của bên thứ ba vào các lọ ứng dụng của bạn không? Vì vậy, tại sao làm điều đó trong một môi trường OSGi?

Cá nhân tôi thích trong trường hợp này để xem lib bên ngoài dưới dạng hộp đen và bọc thư viện cũng như phụ thuộc của nó trong một gói.

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