2009-08-05 9 views
8

Tôi đã xem qua câu hỏi này khi trying to share the Struts packages trong số nhiều gói bên trong vùng chứa OSGi. Tôi muốn tránh cả hai phụ thuộc trùng lặp bên trong các gói và giới thiệu một sự phụ thuộc mới giữa chúng (bằng cách có một gói xuất phụ thuộc nội bộ của nó cho người khác để chia sẻ). Một câu trả lời là rất dễ dàng nếu bạn tình cờ sử dụng Maven, và nếu không, bạn vẫn có thể sử dụng giải pháp Maven để tìm hiểu cách tạo ra kết quả tương tự với một số cơ chế khác.Làm cách nào để chia sẻ thư viện không phải OSGi giữa các gói trong vùng chứa OSGi?

Tôi thấy phương pháp này hữu ích nhiều lần trong dự án của tôi, vì vậy tôi sẽ đăng một ví dụ ở đây.

Trả lời

7

Sử dụng Maven, rất dễ dàng để tạo một gói OSGi từ bất kỳ thư viện nào. Tuy nhiên, tôi nghĩ kết quả tương tự cũng có thể được tạo ra với các cơ chế khác. Giải pháp Maven đã giúp tôi hiểu cách hoạt động của nó.

Tạo gói được thực hiện bằng cách tạo dự án có thư viện dưới dạng phụ thuộc và sau đó đóng gói dự án bằng cách sử dụng maven-bundle-plugin từ Apache Felix project và chỉ định gói thư viện với hướng dẫn Export-Package. Tôi sử dụng này để chia sẻ Google Nghị định thư Buffers giữa bó bên trong một container OSGi:

<?xml version="1.0" encoding="UTF-8" ?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example.lib</groupId> 
    <artifactId>protobuf-dist</artifactId> 
    <version>2.1.0</version> 
    <name>Google Protocol Buffers OSGi Distribution</name> 
    <packaging>bundle</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.google.protobuf</groupId> 
     <artifactId>protobuf-java</artifactId> 
     <version>2.1.0</version> 
     <scope>compile</scope> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>maven-bundle-plugin</artifactId> 
     <extensions>true</extensions> 
     <configuration> 
      <instructions> 
      <Export-Package>com.google.protobuf</Export-Package> 
      </instructions> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Nếu bạn muốn tất cả phụ thuộc bắc cầu lăn vào bó, quá, sử dụng các mục tiêu bundleall của các plugin.

Plugin nhận dạng và tôn trọng các tệp kê khai OSGi hiện có trong phần phụ thuộc.

Bạn cũng có thể sử dụng plugin gói để chỉ tạo tệp kê khai và yêu cầu trình bao đóng gói jar (hoặc lắp ráp jar-with-dependencies) để sử dụng tệp kê khai đó thông qua phần lưu trữ. Trang của plugin được liên kết ở trên cho thấy cách thực hiện điều đó.

9

Một con đường bổ sung cho những người không nên quan tâm đến maven, không thể cổng, hoặc hoàn toàn hài lòng với kiến ​​/ ivy

Tôi đã tìm thấy rằng cách dễ nhất để thực hiện nhiệm vụ nêu là để biến phi OSGi thư viện vào thư viện OSGi bằng cách cho phép tệp kê khai xuất tất cả các gói và thêm vào một số tên/phiên bản biểu tượng approriate. Tôi đã có thể làm điều này rất dễ dàng với bnd thông qua các tác vụ kiến ​​(hoặc thậm chí gọi lệnh trực tiếp). Ngoài ra còn có repositories chứa phiên bản "osgi-ified" của nhiều thư viện phổ biến. Một số thư viện (thời gian joda) đã được vận chuyển với các tệp kê khai OSGi chính xác.

+1

Ngoài ra còn có các kho chứa phiên bản "osgi-ified" của nhiều thư viện phổ biến: SpringSource là một phiên bản lớn: http://www.springsource.com/repository/app/ – Thilo

+0

cảm ơn liên kết! – basszero