2010-03-31 42 views
11

Nếu bạn đang phát triển một dự án maven đa mô-đun phát triển lớn, có vẻ như không thể tránh khỏi rằng có một số phụ thuộc được đưa ra trong các poms không cần thiết, vì chúng được bao gồm quá mức bởi các phụ thuộc khác. Ví dụ điều này xảy ra nếu bạn có một module A ban đầu bao gồm C. Sau đó bạn refactor và có A phụ thuộc vào một mô-đun B mà lần lượt phụ thuộc vào C. Nếu bạn không cẩn thận, bạn sẽ gió lên với cả B và C trong Danh sách phụ thuộc của A. Nhưng tất nhiên bạn không cần phải đặt C vào pom của A, vì nó được bao gồm quá cảnh, dù sao đi nữa. Có công cụ nào để tìm những phụ thuộc không cần thiết như vậy không?Làm thế nào để tìm phụ thuộc không cần thiết trong một dự án đa maven?

(Những phụ thuộc không thực sự bị tổn thương, nhưng họ có thể che khuất cấu trúc mô-đun thực tế của bạn và có ít thứ trong pom thường là tốt hơn. :-)

Trả lời

12

Đối với một số mức độ bạn có thể sử dụng dependency:analyze, nhưng nó không quá Hữu ích. Đồng thời kiểm tra JBoss Tattletale.

Một thời gian trước, tôi đã bắt đầu một maven-storyteller-plugin để có thể phân tích sâu hơn về poms, nhưng dự án rất xa sản xuất/sử dụng công cộng. Bạn có thể sử dụng mục tiêu storyteller:recount để phân tích phụ thuộc không sử dụng/dự phòng.

Vấn đề với toàn bộ câu chuyện là - cách xác định những thứ "không sử dụng". Những gì là khá tốt để phân tích là cho các tài liệu tham khảo lớp thể hiện. Nhưng nó sẽ không hoạt động nếu bạn đang sử dụng sự phản chiếu - trực tiếp hoặc không trực tiếp.

Cập nhật tháng mười một năm 2014.

Tôi đã chỉ moved my old code of the Storyteller plugin to GitHub. Tôi sẽ làm mới nó và phát hành đến trung tâm để nó có thể sử dụng được cho người khác.

+0

+1 Không có gì để thêm. –

1

Khi bạn có A -> B, B -> C, và sau đó cấu trúc lại như vậy A -> (B, C). NẾU nó là trường hợp đó Một vẫn biên dịch chống lại B, bạn rất nhiều không muốn chỉ đơn giản là nhặt phụ thuộc bởi vì bạn nhận được nó transitively.

Hãy nghĩ về trường hợp khi A -> (B-1.0, C-1.0), B-1.0 -> C-1.0. Mọi thứ được đồng bộ hóa, do đó, để tránh "trùng lặp", bạn xóa C từ Phụ thuộc của. Sau đó, bạn nâng cấp A để sử dụng B-2.0 -> C-2.0. Bạn bắt đầu thấy lỗi vì A muốn các lớp C-1.0 nhưng tìm thấy các lớp C-2.0. Trong khi nhanh chóng hòa giải trong kịch bản này, nó là ít hơn rất nhiều vì vậy khi bạn có rất nhiều phụ thuộc.

Bạn rất muốn thông tin trong pom Một 's mà nói rằng nó một cách rõ ràng hy vọng sẽ tìm C-1.0 trên classpath để bạn có thể hiểu được khi bạn có mâu thuẫn phụ thuộc bắc cầu. Một lần nữa, Maven sẽ thực hiện công việc đảm bảo rằng phiên bản "gần nhất" của bất kỳ cái bình cụ thể nào kết thúc trên đường dẫn lớp của bạn. Nhưng khi mọi thứ xảy ra sai - bạn muốn tất cả metatdata phụ thuộc bạn có thể nhận được.

Trên một lưu ý thực tế hơn một chút, một phụ thuộc không được sử dụng khi bạn có thể xóa nó khỏi pom của bạn và tất cả các bài kiểm tra đơn vị/tích hợp/chấp nhận của bạn vẫn trôi qua.;-)

+1

> ... một phụ thuộc không được sử dụng khi bạn có thể xóa nó khỏi pom > và tất cả các bài kiểm tra đơn vị/tích hợp/chấp nhận của bạn vẫn ... Điều này đúng, nhưng không đưa ra phương pháp phân tích. :) – lexicore

2

tôi

personaly sử dụng trình biên tập pom của M2Eclipse trực quan xem cây phụ thuộc (cây 2D). Sau đó, tôi đưa ra một cái nhìn trong thư mục lib (tai, chiến tranh) có thể phân phối của tôi. Sau đó, vẫn còn trong trình xem phụ thuộc M2Eclipse pom tôi đi đến mọi bên thứ ba, và nhấp chuột phải vào sự phụ thuộc tôi muốn loại trừ (một loại trừ được thêm vào tự động trong phụ thuộc đúng).

Không có quy tắc vàng, chỉ đơn giản là một số lời khuyên cơ bản:

rất nhiều pom là không đúng: rất nhiều libs bên thứ 3 ra có yêu cầu phụ thuộc quá nhiều vào mặc định lập phạm vi, nếu tất cả mọi người cẩn thận nghề pom của họ, bạn không được có quá nhiều phụ thuộc không mong muốn.

bạn cần đoán tên phụ thuộc những gì bạn sẽ phải loại trừ, ví dụ tốt nhất là trình phân tích cú pháp, biến áp, trình tạo tài liệu: xalan, xerces, xalan alfred và co. cố gắng loại bỏ chúng và sử dụng trình phân tích cú pháp jdk1.6 nội bộ, các công cụ apache thông thường, log4j cũng đáng xem xét.

nhìn cũng thường xuyên trong giao lib nếu bạn không có thư viện trùng lặp với phiên bản khác nhau (resolver phụ thuộc của maven nên tránh điều đó)

đi từ dưới lên, bắt đầu với các module thông thường của bạn, sau đó đi lên cho đến khi dịch vụ lớp, cắt giảm phụ thuộc trong mỗi mô-đun, không cố gắng để bắt đầu trong mô-đun tai/chiến tranh, nó sẽ là quá khó khăn

kiểm tra thường xuyên nếu giao hàng của bạn vẫn hoạt động, bằng cách kiểm tra hoặc so sánh và phân phối cũ với cái mới (đặc biệt là trong thư mục web-inf/lib những gì đã biến mất với winmerge/beyoncompare)

+0

Trong trường hợp ai đó vấp ngã điều này - một chút chi tiết hơn và hướng dẫn cập nhật ở đây http://stackoverflow.com/questions/33907162/systematic-approach-with-maven-to-deal-with-dependency-hell –

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