2010-12-30 4 views
5

Tôi đã nhìn vào các công cụ PAX trên OPS4J ví dụ: this one và tôi nghĩ rằng tôi đã tìm ra một cách tốt đẹp để:Tốt cách nào để "quấn" lọ cho OSGi với Maven

  • Chỉ định một artifact
  • tạo một jar lắp ráp (jar có chứa tất cả phụ thuộc) từ jar đó và phụ thuộc bắc cầu của nó
  • Wrap nó với BND để tạo ra một gói OSGi

hóa ra, rằng tôi đã sai - nó không appea r rằng các công cụ PAX thực hiện điều này. (RTFM, phải không? :))

Nhưng điều này khiến tôi băn khoăn: liệu có điều gì đó ngoài kia làm những gì tôi hỏi?

Tôi nghĩ có lẽ tôi có thể làm điều này bằng cách tạo POM đơn giản và sử dụng trình cắm maven-bundle nhưng điều này có vẻ hơi phức tạp đối với những gì tôi hỏi.

LƯU Ý: Tôi nhận được rằng nhúng và lắp ráp bình không thực sự là "cách OSGi" - vì vậy tôi sẽ không làm điều này trừ khi tôi thực sự cảm thấy nó hữu ích. Ví dụ - Spring.

Xin cảm ơn trước.

+0

Tôi nghĩ Spring đã có các mô-đun thân thiện với OSGi. Nếu bạn có lọ bạn cần phải sử dụng, tại sao không nhúng chúng trong một mô-đun OSGi? –

+0

Vâng, mùa xuân. Vì vậy, có lẽ đó là một ví dụ xấu - những gì tôi đang lái xe ở là nó có thể được đau đớn để có để triển khai 15 phụ thuộc (chuyển đổi thành bó hay không) khi bạn không cần những chia 15. – javamonkey79

Trả lời

4

Bạn phải duy trì một POM địa phương để thực hiện điều này. Không phải là một tiện ích mà sẽ đưa vào một thư viện/jar và nhổ ra OSGi MANIFEST thích hợp trong một cái lọ. ServiceMix, cùng với Spring, có rất nhiều thứ đã được đóng gói mà bạn có thể sử dụng làm ví dụ. Hai ví dụ như vậy tôi đề nghị xem xét là:

  • commons-io - thư viện đơn giản wrapper
  • OpenJPA - kết thúc tốt đẹp jar chính và mang lại sự phụ thuộc với nó
+0

Từ làm việc với SMX tôi đã tìm thấy * ngoài đó. Cảm ơn (+1) – javamonkey79

2

Chúng tôi làm điều gì đó tương tự như những gì bạn mô tả. Ví dụ, chúng tôi có một phiên bản nội bộ của Apache QPid. Nó đến như 6 lọ (khách hàng, lõi, phổ biến, backports, vv) mà bạn hiếm khi sẽ sử dụng riêng lẻ. Chúng tôi có một POM với BND lấy tất cả các lọ, và làm cho một uber-osgi-jar từ chúng.

bước:

  1. Khai báo phụ thuộc của bạn (chúng tôi có lọ, vì vậy chúng tôi đã tuyên bố họ như DEPS hệ thống.)
  2. nhập build Plugin maven-bó-plugin (2.1.0)
  3. Set hướng dẫn chính xác cho xuất khẩu, các gói tin và nhập khẩu
  4. Thi hành mục Tiêu 'bọc' at 'gói' giai đoạn
+0

Tôi có thể đính kèm POM nếu cần. – omerkudat

+0

Vâng, đây là những gì tôi muốn nói "Tôi đã nghĩ có lẽ tôi có thể làm điều này bằng cách tạo một POM đơn giản và sử dụng maven-bundle-plugin nhưng điều này có vẻ hơi phức tạp đối với những gì tôi hỏi". . Tuy nhiên, vì tôi không nghĩ rằng có một giải pháp đơn giản hơn ngay bây giờ, nếu bạn đăng một POM tôi sẽ chấp nhận với hy vọng rằng nó sẽ giúp người khác :) – javamonkey79

8

Tôi đã viết một nguyên mẫu maven sẽ giúp bạn quấn một cái lọ như một bó OSGI.

Hãy nói rằng bạn muốn quấn commons-bộ sưu tập phiên bản 3.2.1

tiên nhận được nguyên mẫu và cài đặt nó

git clone git://github.com/HallwayTech/maven-wrap-jar-archetype.git 
cd maven-wrap-jar-archetype 
maven install 

Sau đó sử dụng nguyên mẫu để bắt đầu dự án của bạn.

mvn archetype:create \ 
    -DarchetypeGroupId=com.hallwaytech.osgi \ 
    -DarchetypeArtifactId=wrap-jar \ 
    -DarchetypeVersion=1.0-SNAPSHOT \ 
    -DgroupId=commons-collections \ 
    -DartifactId=commons-collections \ 
    -Dversion=3.2.1 

cd commons-bộ sưu tập

mvn install 

Để triển khai đến một Apache Sling bên trong của Felix chạy:

mvn install -Pdeploy 
1

tôi đã cố gắng The accepted answerErik's answer. Đề nghị của Erik rất đơn giản và làm việc ngay trong hộp. Mặc dù, nó dường như tạo ra một MANIFEST lớn trong trường hợp của tôi, và sau đó tôi nhớ lại p2-maven-plugin. Phương pháp cuối cùng này hoạt động rất tốt trong một số lượng lớn các trường hợp. Nếu tạo phẩm bạn cần đã được bó, hoặc các gói phụ thuộc của nó là các bó, nó chỉ đơn giản là đặt chúng vào repo nó được xây dựng. Nếu không, nó sẽ chạy maven-bundle-plugin với một số cài đặt mặc định (hoặc bạn có thể định cấu hình cài đặt bạn cần). Rất tuyệt!

Tôi đặc biệt thích nó nắm lấy các phụ thuộc chuyển tiếp và chăm sóc những người phụ thuộc quá. Nếu bạn không cần repo, nhưng chỉ sau khi gói bọc, nó là một vấn đề đơn giản để đi anh đào chọn nó ra khỏi target/repository/plugins thư mục.