phụ thuộc độ phân giải là một quá trình hai bước trong Tycho:
Thứ nhất, Tycho tính cái gọi là target platform, đó là sự tập hợp các hiện vật được xem xét để giải quyết sự phụ thuộc. Trong bước này, Tycho đánh giá các phụ thuộc POM theo các quy tắc Maven và thêm kết quả vào nền tảng đích. Ngoài ra, tất cả các hiện vật Tycho bạn đã tạo cục bộ với mvn install
được thêm vào nền tảng đích.
Sau đó, Tycho giải quyết các phụ thuộc của dự án của bạn (từ MANIFEST.MF, feature.xml, v.v.) theo các quy tắc OSGi. Không giống như trong phụ thuộc Maven, phụ thuộc OSGi thường được chỉ định là phạm vi phiên bản . Vì vậy, nếu bạn viết
Require-Bundle: my.bundle;bundle-version="1.2.0"
bạn đang nói rằng bạn muốn phiên bản 1.2.0 trở lên. Bạn thường không muốn chỉ định một phiên bản chính xác ở đây, bởi vì điều này sẽ có tác động đến thời gian chạy. Nhưng bạn muốn kiểm soát những gì xảy ra tại thời điểm xây dựng, đó là lý do tại sao có nhiều cách khác nhau để kiểm soát nội dung của nền tảng mục tiêu.
Trong trường hợp cụ thể, bạn có các sản phẩm POM đầu tiên trong nền tảng đích trong phiên bản được chỉ định trong POM. Sau đó, bạn dường như chỉ định một phụ thuộc POM cho các tạo phẩm Tycho của bạn (không phổ biến, nhưng không sao), vì vậy bạn sẽ có các tạo phẩm Tycho trong phiên bản được chỉ định trong nền tảng đích. Nhưng vì bạn cũng đã xây dựng một phiên bản mới hơn của các hiện vật Tycho tại địa phương với mvn install
, chúng cũng sẽ nằm trong nền tảng đích. Độ phân giải phụ thuộc (bước 2) do đó có sự lựa chọn giữa hai phiên bản, thông thường sẽ chọn phiên bản sau.
Để ngăn các hiện vật được tạo cục bộ không được thêm vào nền tảng đích, bạn có thể xóa tệp ~/.m2/repository/.meta/p2-local-metadata.properties
. (Tôi giả sử bạn đã biết điều này, nhưng chỉ để chắc chắn. Bug 355367 cũng sẽ mang lại một lựa chọn thay thế, thuận tiện hơn trong 0,16.0.)
Và bây giờ cuối cùng tôi nhận được câu hỏi của bạn tại sao hành vi này là khác nhau cho hiện vật POM-đầu tiên so với hiện vật Tycho:
Giả nhiều hiện vật Tycho được xây dựng lại với nhau trong các lò phản ứng tương tự. Sau đó, mỗi tạo phẩm có thể sử dụng các tạo phẩm khác làm phụ thuộc mà không cần bất kỳ cấu hình nền tảng đích cụ thể nào, ví dụ: bạn không cần phụ thuộc POM vào các hiện vật trong cùng một lò phản ứng. (Hay nói cách khác: các hiện vật thượng nguồn từ cùng một lò phản ứng tự động là một phần của nền tảng đích của mô-đun.) Vì vậy, để hỗ trợ tái xây dựng các bộ phận của lò phản ứng Tycho (sau mvn install
của lò phản ứng đầy đủ) cần phải được thêm vào nền tảng đích của mỗi mô-đun. Tycho không thể biết nếu họ ban đầu là một phần của cùng một lò phản ứng, vì vậy nó chỉ thêm tất cả.
Đối với các tạo tác POM đầu tiên, tham chiếu đến tạo phẩm luôn ở đó (thông qua kế thừa cấu hình Maven), ngay cả khi chỉ một phần của lò phản ứng Tycho được tạo. Do đó, không cần phải có bất kỳ cơ chế nào để chọn bất kỳ phiên bản nào của các tạo phẩm POM đầu tiên được xây dựng cục bộ, nhưng Tycho có thể thêm phiên bản được chỉ định chính xác vào nền tảng đích.
Cảm ơn trả lời nhanh chóng của bạn và cho giới thiệu ngắn của bạn để stackoverflow ;-) khi bạn nhận ra tôi đăng các câu hỏi trên mailinglist quá, nhưng vì nó không cho thấy sau ba ngày, tôi quyết định đăng nó ở đây. – howlibird