2012-09-10 28 views
5

Hãy xem xét kịch bản sau: Ứng dụng của tôi có một số phụ thuộc vào các tạo phẩm POM đầu tiên của tôi (được xây dựng với Maven thuần túy) và một số phụ thuộc vào các tạo phẩm đầu tiên của riêng tôi (được xây dựng với Tycho). Đối với các tạo tác POM đầu tiên, Tycho giải quyết chính xác phiên bản mà tôi đã chỉ định trong POM. Đối với các tạo phẩm đầu tiên trong tệp kê khai, Tycho giải quyết các đơn vị được xây dựng cục bộ có thể có phiên bản cao hơn.Tycho giải quyết phiên bản sai của các tạo phẩm đầu tiên của riêng tôi

Trong trường hợp cụ thể của mình, tôi đã chỉ định phụ thuộc trong tệp pom.xml cho tạo phẩm đầu tiên trong phiên bản 1.2.0, nhưng tôi nhận được cảnh báo "Các đơn vị được xây dựng cục bộ sau đây đã được sử dụng để giải quyết các phụ thuộc dự án" với phiên bản 1.3.0.2012xxx.

Tôi đã tìm thấy các lỗi và thảo luận sau đây, nhưng tôi không hiểu tại sao có sự khác biệt trong Tycho giải quyết phụ thuộc POM-đầu tiên và đầu tiên biểu hiện đầu tiên.

+1

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

Trả lời

6

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.

0

Đối với những người quan tâm để buộc tycho bỏ qua hiện vật địa phương khi giải quyết nền tảng đích, hãy thêm CLI tycho.localArtifacts = ignore như trong ví dụ:

mvn clean install -Dtycho.localArtifacts=ignore 

Thông tin chi tiết có thể được tìm thấy trên Tycho-Target Eclipse Wiki