2012-12-31 19 views
6

Hãy xem xét trường hợp phổ biến của việc sử dụng một lọ được phiên bản cụ thể để thực hiện một phương pháp, nhưng không phơi bày bất kỳ loại nào từ bình đó trong API công cộng hoặc được bảo vệ (chỉ trong chữ ký phương thức của phương thức riêng). Bây giờ những gì tôi muốn là một liên kết biên dịch tự động của mã này bằng tên mangling tên gói ban đầu và thay thế nó trong mã được tạo trong SBT (một lần nữa: tôi muốn thêm một plugin vào SBT hoặc một thiết lập trong build.sbt thực hiện điều này trên mỗi sbt compile).Trong SBT, người ta có thể tự động đặt tên-mangle các gói được sử dụng riêng tư không?

Mục đích của việc này là để tránh lỗi classpath với nhiều phiên bản có thể không tương thích của một lớp có cùng tên gói/lớp. Lưu ý: trong tình huống tôi mô tả ở trên, nội tuyến hoặc tên mangling này phải luôn hoạt động và cho phép phiên bản một bước-địa ngục (với chi phí của các lọ lớn hơn).

+0

Có vẻ như đây có thể là trường hợp sử dụng cho [Scala Macros] (http://scalamacros.org/)? – logan

+3

Đây là những gì OSGi thường được sử dụng cho. OSGi sử dụng các thủ thuật thông minh với các trình nạp lớp thay vì tên mangling, nhưng nó đạt được hiệu quả tương tự. –

+0

Tôi không biết cách nào để thực hiện tương đương với sbt của việc di chuyển lớp từ trình cắm maven-shade-plugin: http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html – mpilquist

Trả lời

2

Điều này nghe giống như loại điều mà ProGuard sẽ có thể thực hiện. Có một SBT ProGuard plugin nhưng nó dường như không được duy trì tích cực.

Nếu tôi giải quyết vấn đề này, nói cá nhân tôi sẽ xem xét một trình nạp lớp tùy chỉnh cho một giải pháp thay vì mang tên mangling.

+0

Vui lòng giải thích "nói cá nhân tôi sẽ xem xét một trình nạp lớp tùy chỉnh" – samthebest

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