2016-05-17 23 views
6

Tôi đang cố gắng tìm cách hỗ trợ 2 phiên bản API khác nhau trong cơ sở mã của mình. Họ có cùng tên gói nhưng làm việc khác nhau nhiều dưới mui xe (hai hệ thống hoàn toàn khác nhau). Tôi có thể làm cái này như thế nào?Hỗ trợ 2 phiên bản API trong Java

Cả hai API này cũng có sự phụ thuộc vào Lâu đài Bouncy nhưng chúng sử dụng các phiên bản khác nhau của nó. Làm cách nào để tôi tính đến điều này?

+2

Bạn có thể sử dụng công cụ để đổi tên các gói, ngay cả trong các lọ được xây dựng hoặc bạn có thể sử dụng thứ gì đó như OSGi (đổi tên gói dễ hơn) –

+0

Bạn định sử dụng các thư viện đó trong mã của riêng mình như thế nào? 2 phiên bản khác nhau có nghĩa là 2 chữ ký khác nhau (ví dụ) ... bạn CÓ phải tạo 2 phiên bản ứng dụng khác nhau ... tôi không thấy bất kỳ lựa chọn nào khác ở đây ... – Pras

+1

@PeterLawrey Bạn đã sử dụng hoặc làm công cụ gì bạn biết không? Tôi chỉ tìm thấy một được gọi là "Jar Jar Liên kết" dường như làm điều này. – Rob

Trả lời

1

Giải pháp tôi sẽ bắt đầu bằng ... Tải API vào trình nạp lớp tùy chỉnh để tải lớp con lên lớp cha trước tiên. Nếu bạn biên dịch Lâu đài Bouncy bên trong API thì bạn sẽ không phải lo lắng về việc tải nó một cách riêng biệt. Nếu bạn tự động nạp jar Lâu đài Bouncy trong thời gian chạy, sau đó trong trình nạp lớp tùy chỉnh, bạn sẽ thêm Lâu đài Bouncy và API của bạn vào trình nạp lớp đó. Sử dụng URLClassLoader và xem liên kết của tôi bên dưới để tải phụ huynh lần cuối.

How do I create a parent-last/child-first ClassLoader in Java, or How to override an old Xerces version that was already loaded in the parent CL?

0

Bạn có thể tạo trình nạp lớp tùy chỉnh để tải các lớp thích hợp dựa trên logic cần thiết để tải một phiên bản của API so với phiên bản kia.

2

tôi sẽ không khuyên điều này nếu bạn biết những gì bạn đang làm nhưng bạn có thể sử dụng một URLClassLoader như sau:

URLClassLoader classLoaderA = URLClassLoader.newInstance(new URL[] {new URL("versionA.jar")}); 
URLClassLoader classLoaderB = URLClassLoader.newInstance(new URL[] {new URL("versionB.jar")}); 

tải lớp:

classLoaderA.loadClass("SomeClass"); 

Một tùy chọn là xem OSGI.

+0

Điều này không tính đến các vấn đề chính của anh khi tải các phiên bản riêng biệt của Lâu đài Bouncy cũng như nhiều phiên bản của cùng một lớp từ API của anh. Phương pháp của bạn sẽ vẫn tải phụ huynh trước và nếu không được lập trình đúng cách sẽ có ý nghĩa ClassNotFound. – Underbalanced

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