Tôi quen thuộc với Import-Package
và Export-Package
, nhưng đây là một hình mới cho tôi. Nó làm gì?Tiêu đề tệp kê khai riêng tư làm gì?
Trả lời
Khi chạy trong vùng chứa OSGi, không có gì. Trong thực tế, nó thậm chí không được đề cập trong đặc tả OSGi (tôi đã kiểm tra R4).
Tuy nhiên, nó có thể được chỉ định trong tệp .bnd
để sử dụng bởi bnd tại thời gian xây dựng. Nếu vậy, nó có thể được sử dụng để xác định những gì đi vào bó. Khi bnd xây dựng một gói, nó sẽ tự động xác định lớp nào cần phải đi vào gói. Tất cả các lớp trong các gói được xuất đều được bao gồm và tất cả các lớp mà chúng phụ thuộc vào (quá cảnh) cũng được bao gồm. Điều này có nghĩa rằng nếu một lớp dường như không được sử dụng, thì nó sẽ không được bao gồm trong gói. Tuy nhiên, bạn có thể sử dụng lệnh Private-Package để yêu cầu bnd bao gồm nội dung của gói trong gói, ngay cả khi nó có vẻ không được sử dụng. Nếu lệnh Private-Package không được chỉ định, thì nó sẽ tự động được tạo bởi bnd.
Các tài liệu cho Private-Package đọc như sau:
Private Gói
Phương pháp được đề cử là đồng nhất với tiêu đề xuất trọn gói, sự khác biệt duy nhất là, đó là những gói không đã xuất. Tiêu đề này sẽ được sao chép vào tệp kê khai. Nếu một gói được chọn bởi noth tiêu đề gói xuất và riêng, thì xuất sẽ được ưu tiên.
tư nhân trọn gói = com. *
Trong thực tế tư nhân đóng gói làm nhiều hơn chỉ là không xuất khẩu một gói. Nếu các gói được chỉ định trong Gói Riêng tư không được định nghĩa bên trong dự án của riêng bạn và không được nhập vào trong Gói-Nhập khẩu thì chúng sẽ tự động được chèn vào trong bình của bạn. Vì vậy, đây là một cách dễ dàng để bao gồm các phụ thuộc không phải OSGi. Hãy cẩn thận mặc dù nội tuyến có thể dễ dàng dẫn đến các vấn đề về classpath.
Nếu bạn biết những gì liên kết tĩnh thì bạn hiểu Gói riêng tư. Nếu không đọc trên.
Gói riêng tư là cách của bnd cho bạn biết các gói phải nằm trong bình nhưng không được xuất. Đó là không phải là tiêu đề OSGi mà là lệnh 'bnd'.
Hướng dẫn xác định các gói từ đường dẫn lớp (có ký tự đại diện) phải được bao gồm trong JAR. bnd là duy nhất mà nó điền JAR từ một đặc điểm kỹ thuật và không phải một số thư mục như hầu hết các công cụ xây dựng. Lý do là trừ khi các mô-đun được 'thiết kế' và bố cục của chúng được xem xét cẩn thận, chúng hiếm khi cung cấp các lợi ích mô-đun.
Nói chung gói riêng chỉ định các gói giữ các lớp không được chia sẻ với các gói khác, tức là các lớp triển khai. Mặc dù nói chung họ đến từ dự án tương ứng mà bnd được sử dụng trong nó là hoàn toàn chấp nhận được chúng từ bất kỳ JAR khác trên classpath.
Một trường hợp sử dụng là thư viện có utils. Biến một thư viện util trong một bó thường tàn phá với các phụ thuộc vì các utils có xu hướng phụ thuộc vào rất nhiều thứ không liên quan; bạn sử dụng một phương pháp nhỏ và đột nhiên bạn kéo trong 30Mb phụ thuộc. bnd tự sử dụng rất nhiều mô hình này với các gói aQute.lib *, các gói từ thư viện này sẽ không bao giờ được xuất khẩu. Đó là giao dịch giữa kích thước gói và 'tải xuống internet'.Sự khác biệt có thể nhìn thấy giữa thế giới của Eclipse và Apache Felix. Gói Apache Felix thường độc lập và không yêu cầu tất cả các loại hỗ trợ và gói tiện ích trong khi các gói của Eclipse có xu hướng yêu cầu nhiều gói hệ thống ống nước. Tôi nghĩ sự khác biệt này phần lớn được gây ra bởi PDE của Eclipse, làm cho nó không thể bao gồm các gói từ các dự án khác, trừ khi bạn sao chép mã nguồn mà tất nhiên là không lớn.
Trong thế giới C, chúng có thứ gọi là liên kết tĩnh. Sau khi một chương trình được liên kết, bất kỳ sự giải quyết nào được lấy ra từ một thư viện và được thêm vào đích. Đến một mức độ nhất định Private-Package là cùng một ý tưởng. Có thực sự là một tiêu đề có điều kiện-gói mà tĩnh liên kết các gói quy định và bất cứ điều gì họ quá phụ thuộc vào (miễn là họ rơi vào mô hình).
Cuối cùng bnd hiển thị các gói mở rộng không được xuất trong tiêu đề Gói riêng tư trong tệp kê khai. Sau khi tất cả, một biểu hiện được cho là mô tả nội dung ...
Nếu bạn là tác giả, bạn có thể loại bỏ các tiêu đề với -removeheaders: tư nhân trọn gói (hoặc trong maven với < _removeheaders> Private-Package
Tôi có thể hỏi lý do tại sao BND không "gói riêng" tất cả các lớp không xuất khẩu? nếu bạn có một lớp trong dự án của bạn, đó là vì bạn cần nó, vì vậy nếu nó không được xuất, không phải là riêng tư. – Hilikus
Bạn phải chỉ định các gói riêng vì bnd không giả định tất cả các lớp từ thư mục src nên được bao gồm, vì vậy không có phạm vi nào cho phép trừ phép xuất bất kỳ gói nào trên đường dẫn lớp của bnd có thể được bao gồm trong một gói, hoặc là pr ivate hoặc xuất khẩu. Bằng cách này, bnd có thể xây dựng nhiều gói từ một dự án duy nhất không giống như hầu hết các môi trường xây dựng. Nó cũng cho phép xuất các gói API được cung cấp bởi gói, ngay cả khi chúng đến từ một gói/jar khác. –