2009-10-12 26 views
19

Đây là một vấn đề phổ biến. Tôi đang sử dụng 2 thư viện A.jarB.jar và chúng phụ thuộc vào các phiên bản khác nhau của cùng một lọ.
Hãy nói rằng trong thời gian chạy Tôi cần THIS.xxxjarTrình nạp lớp Java - cách tham khảo các phiên bản khác nhau của một cái bình

MY.jar 
    -> A.jar -> THIS.1.0.0.jar 
    -> B.jar -> C.jar -> THIS.5.0.0.jar 

tôi có thể biên dịch jar cụ thể (A.jar/B.jar) chống lại sự phụ thuộc của nó, nhưng khi chạy Tôi đã tải chỉ có 1 phiên bản. Cái nào?
Chỉ tải 1 phụ thuộc (phiên bản mới nhất) có nghĩa là mã của tôi có thể sẽ ném ngoại lệ thời gian chạy nếu các thư viện không tương thích ngược (có thư viện Tương thích ngược không?).

Dù sao tôi biết rằng một cái gì đó như OSGi có thể khắc phục vấn đề này.
Tôi đang tự hỏi theo cách cũ để sửa chữa loại vấn đề là những gì ...

Thanks a lot

+0

Có thể đạt được điều này không? Làm thế nào OSGi giúp? Chúng tôi một lần nữa giới thiệu một sự suy giảm về OSGi mà là một chi phí trong phát triển phần mềm sản phẩm điển hình (đặc biệt là cho nhúng) – sskumar86

Trả lời

7

"Old cách" mà bạn đề cập (và một trong những OSGi chắc chắn sử dụng dưới mui xe) là cài đặt ClassLoader của riêng bạn cho cả hai chi nhánh phụ thuộc của bạn. Đó là cách, ví dụ, các máy chủ ứng dụng có thể chạy cả hai phiên bản cũ hơn và mới hơn của cùng một ứng dụng bên trong cùng một JVM.

Đọc về thứ bậc lớp học.

Trong thiết lập của bạn, phần khó khăn là điểm chung, nơi các lớp học từ cả hai nhánh gặp nhau. Cả hai nhánh đều không thể sử dụng các lớp được nạp vào một lớp khác. Cách để làm cho nó hoạt động là để đảm bảo chỉ các lớp được nạp bởi trình nạp lớp khởi động (các lớp JRE) hoặc trình nạp lớp của MY.jar được chuyển xuống cả hai nhánh.

1

Nhiều thư viện tương thích ngược. Nhưng không phải tất cả ..


Cách cũ là cố gắng phụ thuộc chỉ từ một phiên bản.

Có thể an toàn hơn khi biên dịch cả hai cùng một phiên bản (mới nhất).
Ít nhất bạn nhận được lỗi biên dịch, thay vì lỗi thời gian chạy.

Nếu cần, bạn có thể sửa đổi một chút thư viện của bạn làm việc với các phụ thuộc cũ ...
này sẽ yêu cầu quyền truy cập vào các nguồn ...


Xin lưu ý rằng khả năng tương thích thời gian biên dịch cũng sẽ không đảm bảo hành vi thời gian chạy chính xác. Đây là một bước, sau đó bạn có thể:

  • đọc file WhatsNew cho phiên bản mới của jar
  • nhìn trên Internet cho người sử dụng báo cáo vấn đề tương thích
  • ghi JUnits
  • so sánh các mã trong cả hai lọ
4

OSGi có thể khắc phục sự cố này. Gói OSGi không có gì khác ngoài một cái lọ có siêu dữ liệu bổ sung chi tiết các phiên bản. Gói có số phiên bản và sẽ chi tiết số phiên bản (hoặc dải ô) của các lọ phụ thuộc.

Hãy xem this introductory Javaworld article để biết thêm thông tin.

Để giải quyết vấn đề này mà không cần OSGi, hãy đảm bảo rằng bạn biên dịch và chạy với các lọ tương thích. Như bạn đã khám phá ra, đó không nhất thiết là một nhiệm vụ tầm thường. Kể từ khi lọ không nhất thiết phải xác định các phiên bản của họ, cách duy nhất chắc chắn để làm điều này để ghi lại/so sánh tổng kiểm tra hoặc chữ ký.

1

Như đã đề cập trong KLE, cách tiếp cận mặc định là phụ thuộc vào phiên bản mới hơn. Không có bảo đảm, nhưng hầu hết thời gian hoạt động. Có lẽ cách tốt nhất (trong khi là một cồng kềnh) đang sử dụng OSGI để vượt qua nó.

0

Để tham khảo một cơ bản "oldway" thực hiện thanh toán https://github.com/atulsm/ElasticsearchClassLoader

này cung cấp một cách tiếp cận để xử lý các phiên bản tương thích không lạc hậu của việc sử dụng của khách hàng elasticsearch.

Các vấn đề liên quan