2014-12-11 12 views
14

Tôi gặp sự cố tương thích API sau và tìm cách giải quyết vấn đề.Có cách nào để "bí danh" một lớp trong Java cho một lớp khác không?

TL; DR Có cách nào để tạo "bí danh" cho một lớp trong Java không? I E. một số mẹo để làm cho com.acme.foo.SomeEnum trở thành bí danh cho com.acme.bar.SomeEnum?

Câu chuyện dài. (Tôi đang cân nhắc nó một chút để tránh chỉ định ngón tay.)

Tôi đang làm việc với một công cụ Java mạnh mẽ cũng hỗ trợ các plugin. Không có xác định chính xác công khai API (theo ý bạn về những gì bạn có thể và không thể chạm), chỉ các lớp học, phương pháp và bảo mật riêng tư/được bảo vệ/gói/công khai thông thường. Có các điểm mở rộng được xác định (như, mở rộng lớp com.acme.plugin.Plugin), nhưng sau đó bạn sẽ có quyền truy cập vào một khu vực rộng lớn của nội bộ của công cụ.

Trong phiên bản cập nhật nhỏ gần đây (như, 1.2.3 ->1.2.4) phát triển công cụ đã chuyển một lớp enum để gói khác - com.acme.foo.SomeEnum trở thành com.acme.bar.SomeEnum. Tôi nghĩ rằng nó được cho là một sự tái cấu trúc tầm thường, không phải là tái cơ cấu serios.

Lớp này, tuy nhiên, dường như đã được một số plugin sử dụng. Kết quả là các plugin này hiện không tương thích với phiên bản mới nhất. Hầu hết các plugin khá hữu ích, nhưng không chủ động được duy trì. Mọi người đã viết chúng cách đây nhiều năm - và họ chỉ làm việc qua nhiều năm, với hàng chục bản cập nhật phiên bản. Vì vậy, điều này có tiềm năng tiêu cực liên quan đến hệ sinh thái plugin của công cụ.


Câu hỏi của tôi là, nếu có một số cách trong Java để tạo ra một "bí danh" com.acme.foo.SomeEnum cho com.acme.bar.SomeEnum? Điều này sẽ cho phép các plugin cũ tiếp tục hoạt động với phiên bản mới của công cụ.

Một số mẹo của trình nạp lớp? Trong JavaScript mà sẽ là tầm thường để shim, nhưng trong Java?

Tại sao I đang yêu cầu điều này. Tôi là tác giả của plugin Maven kết thúc tốt đẹp công cụ được đề cập. Vì vậy, tôi có thể dễ dàng thêm đường vào cà phê này, như bộ nạp lớp và vân vân. Nếu có một cách kỹ thuật để thực hiện công việc này, tôi sẽ ở vị trí để tiết kiệm hầu hết các hệ sinh thái plugin của công cụ - ít nhất là cho người dùng Maven.

Tôi đã liên hệ với nhà cung cấp công cụ về điều này, nhưng không chắc chắn về sự thành công.

Chỉ cần làm rõ - I am không nhà cung cấp Công cụ được đề cập. Tôi (a) viết các plugin cho The Tools (và không gặp rắc rối lớn khi cập nhật plugins của tôi) và (b) là tác giả của số the-tool-maven-plugin cho phép thực thi Công cụ trong Maven được tạo. Tôi cũng tham khảo ý kiến ​​rất nhiều về Công cụ và quan tâm đến hệ sinh thái của nó (có rất nhiều plugin rất hữu ích).


Cập nhật

Kết thúc câu chuyện: các nhà phát triển của Công cụ mất điểm của tôi vào tài khoản, và quyết định phục hồi các thay đổi. Kudos cho điều đó!

+1

TL; DR - Không có. –

+0

(Ngoại trừ có lẽ bằng cách sử dụng một số cơ sở gỡ lỗi.) –

+0

Đây có phải là thời gian biên dịch mà bạn muốn hoặc một thời gian chạy (như trong sự phản ánh)? –

Trả lời

4

Tôi khuyên bạn nên sử dụng jarjar.Đây là một công cụ cho phép bạn đóng gói lại các lớp trong thư viện. Bạn có thể chạy điều này dựa trên phiên bản mới nhất của công cụ và di chuyển lớp SomeEnum đến một gói không xung đột với các plugin.

Tài liệu Getting Started có ví dụ, với jaxen.jar, có vẻ liên quan đến tình huống của bạn.

+0

Ý bạn là, để đóng gói lại * công cụ *? Một ý tưởng rất thú vị. – lexicore

+0

Vâng đó là những gì tôi đang đề xuất. Tôi chưa bao giờ cá nhân sử dụng nó, nhưng những người khác đã đề xuất điều này để giải quyết xung đột lớp học trong Android (tức là tôi tin rằng có hoặc là một số mã apache được nhúng trong lõi Android). – EJK

+1

Ý tưởng rất hay. Điều này sẽ làm việc một phần. Điểm bất lợi là các plugin được biên dịch dựa trên phiên bản * mới * của Công cụ sẽ không thành công. Nó chỉ cũ xor mới, không phải cả hai cùng một lúc. Một bí danh (nếu có thể) có thể cho phép cả hai chạy song song. – lexicore

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