2015-09-05 38 views
5

Trường hợp đơn giản đối với tôi: Tôi đang sử dụng 2 thư viện scala rất phổ biến nhưng xung đột: Spark SQL & JSON4s. Mỗi phụ thuộc vào các phiên bản khác nhau của trình phân tích cú pháp XML của Jackson.JAR HELL trong IDE (intelliJ), mvn-test và mvn-package: cách hợp nhất việc di chuyển phụ thuộc trong tất cả các cài đặt?

Vì không có ai ngoại trừ chương trình của riêng tôi đang sử dụng JSON4, một giải pháp đơn giản là di chuyển các gói org.json4s.jacksoncom.fasterxml.jackson đến các vị trí mới.

Tuy nhiên, plugin maven-shade chỉ có thể thực hiện việc này trong quy trình đóng gói vì tất cả các thử nghiệm và chạy IDE xảy ra trước đó. Điều này vẫn khiến tất cả các kiểm thử thất bại, bất kể có chạy thử nghiệm mvn-test hay scala trong IDE hay không.

Có plugin nào có thể quản lý chung các chính sách di chuyển gói cho cả ba trường hợp: JAR-packaging/mvn-test/IDE-run? Tôi đã tìm kiếm trên Internet cả ngày và không thể tìm thấy câu trả lời.

+0

Các phiên bản khác nhau của Jackson là gì? Bạn có thể ghi đè lên một trong các phụ thuộc trong tệp pom.xml của riêng mình để chỉ có một cá thể tồn tại. –

+0

Bạn sẽ không tin điều này: 3.2.10 (Spark) so với 3.2.11 (Mã của tôi). Nếu Spark jackson được ghi đè lên 3.2.11, nó có lỗi classNotFound, nếu tôi thay đổi jackson của tôi thành 3.2.10 một số thử nghiệm và ngắt tính năng của tôi. Vì vậy, tôi đang trong tình huống khó xử bây giờ – tribbloid

+0

Tôi chỉ nói đùa một nửa, nhưng sử dụng OSGi để tải cả hai phiên bản ... –

Trả lời

4

Chúng tôi đã giải quyết vấn đề bằng cách biên dịch lại (và vá) để căn chỉnh các thư viện. Bất cứ điều gì liên quan đến bóng râm là sẽ ủng hộ một phiên bản trên khác, có nghĩa là những gì bạn có thể sửa chữa trong một thư viện, bạn có thể phá vỡ khác.

Và đối với những ý kiến ​​từ các trại OSGi, vâng, đó là những gì OSGi đã có nghĩa là để sửa chữa, nhưng nó không hoạt động ra rất tốt trong bối cảnh Spark :)

có bạn xem là hạ một trong hai phiên bản để sắp xếp tài nguyên? Thường thì một trong những thư viện quản lý để phát hành đầu tiên, để lại một thứ hai đằng sau chỉ một chút ... Đôi khi câu trả lời có thể được tìm thấy trong chạy một phiên bản phù hợp nhưng cũ phù hợp với dự án "cuối cùng được phát hành".

+0

Điều đó nghe có vẻ khó hơn tôi nghĩ: Tôi từng tin rằng các đồ tạo tác bóng mờ chỉ có các gói được đổi tên và có thể cùng tồn tại với một gói chưa được giải nén (miễn là một trong số chúng được sử dụng bởi chính tôi chứ không phải bởi thư viện khác). Tôi đã hạ cấp cho các trường hợp khác trước đây, nhưng trong trường hợp này json4s-jackson 3.11 cung cấp một số chức năng quan trọng gần như không thể thực hiện được trên phiên bản cũ hơn – tribbloid

+0

@tribbloid Bạn sẽ không thích điều này, nhưng tùy chọn tô bóng chủ yếu cho những ai thấy khó khăn để duy trì một classpath. Nó theo nghĩa đen sẽ mở các lọ (vì chúng là các tệp zip) và sao chép chúng vào jar mục tiêu (một lần nữa là các tệp zip), do đó tô bóng khi bạn có các phiên bản khác nhau của cùng một cái bình thường để lại cho bạn một phiên bản làm việc của bình đó một) và các tham chiếu đến các mục nhận biết về jar cũ đôi khi bị hỏng, tùy thuộc vào việc các lớp phụ thuộc có hoạt động giống với các thay thế của chúng hay không. –

+1

Nếu có thể, và nếu bạn không muốn thực hiện việc biên dịch tất cả, tôi sẽ cố gắng tìm một ngày mà tất cả các thư viện sắp xếp và sau đó nâng cấp/hạ cấp các thành phần để có được bản phát hành bạn muốn. Đôi khi điều đó có nghĩa là chỉ vá và biên soạn một vài món đồ, thay vì cái thứ khổng lồ này. –

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