2016-02-13 26 views
6

Tôi có một ứng dụng web trong đó phụ thuộc kéo trong hai lọ gọi:Maven - Nhiều phiên bản của cùng một sự phụ thuộc

  1. Javassist-3.9.0.GA.jar
  2. Javassist-3.20.0-GA .jar

khi tôi gói WAR Tôi có cả hai trong thư mục WEB-INF/lib, câu hỏi của tôi là ứng dụng đang chạy và tại sao tôi không gặp bất kỳ vấn đề nào vì dường như tôi có cùng lớp trong cả hai lọ và có nên có vấn đề? phải không?

+1

Nếu bạn thực sự có hai phiên bản của cùng một hiện vật trong chiến tranh 'của bạn, bạn đang làm điều gì đó sai ... với Maven mặc định và maven-war-plugin sẽ không bao giờ có một tệp jar trùng lặp trong thư mục lib của bạn .... (Có vẻ như bạn đang làm những việc thủ công mà nên để lại maven để làm) ... – khmarbaise

+0

Cảm ơn, nếu tôi đang sử dụng mục tiêu 'gói' để xây dựng tệp chiến tranh, có phải nó không sử dụng plugin maven war để làm điều đó không? nếu không, những gì khác nhau maven-war-plugin nào để 'gói' mục tiêu? –

+0

'gói' không phải là một mục tiêu đó là vòng đời Nếu bạn đã đặt đúng' chiến tranh 'trong tệp pom của bạn, thao tác này sẽ hoạt động ra khỏi hộp ... Tốt nhất là xem tệp pom bạn đang sử dụng .. – khmarbaise

Trả lời

14

Đối với Java, việc bạn cung cấp bao nhiêu phiên bản không quan trọng. Trình nạp lớp mặc định sẽ chỉ chọn trình đầu tiên trên đường dẫn lớp mà nó có thể tìm thấy.

Vì bạn có thể chạy các ứng dụng mà không có lỗi này có nghĩa là một trong những cách sau:

  • nếu Javassist-3.9.0.GA.jar là lần đầu tiên trên classpath: ứng dụng của bạn không dựa vào mới API hoặc sửa lỗi trong javassist-3.20.0-GA.jar Cũng không có API nào bạn sử dụng của thư viện này thay đổi giữa các phiên bản này (thư viện không nên làm giữa các phiên bản nhỏ)

  • if javassist-3.20.0-GA .jar đầu tiên trên đường dẫn lớp: thư viện tương thích ngược

Tôi đề nghị:

  • Nếu những phụ thuộc là phụ thuộc trực tiếp vào các phần khác nhau của ứng dụng của bạn, hãy chắc chắn bạn đang sử dụng ở khắp mọi nơi cùng một phiên bản. Cách tốt nhất là sửa phiên bản trong phần dependencyManagement của POM cha và sau đó bỏ qua thuộc tính phiên bản trong phần phụ thuộc.
  • Nếu những phụ thuộc này là phụ thuộc transitive, thì loại trừ phụ thuộc bạn không muốn sử dụng để đảm bảo bạn chỉ có một phiên bản của thư viện trong ứng dụng cuối cùng của bạn. Ngoài ra, hãy xem xét để gửi một vấn đề cho dự án vẫn sử dụng phiên bản cũ và yêu cầu họ nâng cấp phiên bản của phụ thuộc.
  • Nếu bạn cần làm việc với hai phiên bản không tương thích của cùng một thư viện, có cùng tên gói và tên lớp, hãy xem xét sử dụng hệ thống mô-đun như OSGi, hỗ trợ chạy các phiên bản khác nhau của cùng một thư viện.
+0

Tôi hiểu điều đó và loại giải thích hợp lý cho điều đó, nhưng điều đó không có nghĩa là ứng dụng thực sự gặp rủi ro bởi vì nếu tôi có sự phụ thuộc dựa vào Lớp từ 3.9.0.GA và lớp đó được cập nhật trong 3.20 .2-GA và cũng 3.20.0-GA là đầu tiên và trong classpath VÀ phụ thuộc đó cần phiên bản của lớp đó trong 3.9.0.GA? –

+0

Ngoài ra một câu hỏi khác là làm thế nào để tìm ra cái nào là đầu tiên trong classpath? –

+0

Bạn không thể tìm ra cái nào là cái đầu tiên ... Đây là một vấn đề lớn trong ứng dụng của bạn ... Bạn nên sửa lỗi này ... nếu không ứng dụng của bạn có thể chạy và đôi khi nó sẽ thất bại ... – khmarbaise

2

Trả lời "mọi đề xuất cách khắc phục sự cố?" hãy xem Resolving conflicts using the dependency tree. Với lệnh mvn dependency:tree bạn sẽ có thể biết bất kỳ phụ thuộc nào đến từ đâu. Khi bạn biết các tạo phẩm nào phụ thuộc vào javassist, bạn có thể thêm một mục loại trừ để tránh một trong các phiên bản javassist.

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