2010-12-30 15 views
44

Maven dependency:analyze phàn nàn về các phụ thuộc trong dự án của tôi. Làm thế nào để nó xác định được không sử dụng và được khai báo không? Tôi nên làm gì với họ?Phụ thuộc không sử dụng/không khai báo trong Maven là gì? Làm gì với chúng đây?

Ví dụ:

$ mvn dependency:analyze 
... 
[WARNING] Used undeclared dependencies found: 
[WARNING] org.slf4j:slf4j-api:jar:1.5.0:provided 
[WARNING] commons-logging:commons-logging:jar:1.1.1:compile 
[WARNING] commons-dbutils:commons-dbutils:jar:1.1-osgi:provided 
[WARNING] org.codehaus.jackson:jackson-core-asl:jar:1.6.1:compile 

... 
[WARNING] Unused declared dependencies found: 
[WARNING] commons-cli:commons-cli:jar:1.0:compile 
[WARNING] org.mortbay.jetty:servlet-api:jar:2.5-20081211:test 
[WARNING] org.apache.httpcomponents:httpclient:jar:4.0-alpha4:compile 
[WARNING] commons-collections:commons-collections:jar:3.2:provided 
[WARNING] javax.mail:mail:jar:1.4:provided 

Lưu ý: Rất nhiều trong số này phụ thuộc được sử dụng trong bao bì thời gian chạy của tôi và tôi đã tuyên bố họ theo quy định để tránh việc cùng một thư viện trên classpath hai lần với các phiên bản khác nhau.

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/19382814/. –

Trả lời

55

Không chắc chắn cách Maven xác định điều này. Không bắt buộc phải giải quyết tất cả các mục được báo cáo bởi điều này, nhưng thông tin này có thể được sử dụng cho phù hợp.

Sử dụng phụ thuộc không khai báo là những thứ bắt buộc, nhưng chưa được khai báo rõ ràng là phụ thuộc trong dự án của bạn. Tuy nhiên, chúng có sẵn nhờ sự phụ thuộc quá độ của các phụ thuộc khác trong dự án của bạn. Đó là một ý tưởng tốt để khai báo một cách rõ ràng những phụ thuộc này. Điều này cũng cho phép bạn kiểm soát phiên bản của những phụ thuộc này (có lẽ phù hợp với phiên bản do thời gian chạy của bạn cung cấp).

Đối với phụ thuộc khai báo chưa sử dụng, bạn nên xóa chúng. Tại sao thêm sự phụ thuộc không cần thiết vào dự án của bạn? Nhưng sau đó sự chuyển đổi có thể mang lại những điều này dù sao, có lẽ, mâu thuẫn với các phiên bản thời gian chạy của bạn. Trong trường hợp này, bạn sẽ cần phải xác định chúng - về cơ bản là để kiểm soát version.

Nhân tiện, mvn dependency:tree cho cây phụ thuộc của dự án, cung cấp cho bạn cái nhìn tốt hơn về cách mỗi phụ thuộc phù hợp trong dự án của bạn.

+4

Ngoài ra, phụ thuộc có thể xuất hiện không sử dụng, nhưng thực sự là. Một số ví dụ về điều này là các trình điều khiển jdbc hoặc các lọ cấu hình có ngữ cảnh ứng dụng cần thiết. – AHungerArtist

+7

Các phụ thuộc với phạm vi 'thời gian chạy' hoặc' được cung cấp' sẽ gắn cờ là "Không được khai báo" trừ khi bạn sử dụng cờ 'ignoreNonCompile' khi phân tích các phụ thuộc. –

+3

Tại sao bạn nên khai báo một cách rõ ràng các phụ thuộc transitive? Không phải là tự động hóa phụ thuộc transitive một phần của những gì Maven là tốt cho? – slim

2

Câu trả lời cho:

"Làm cách nào để xác định cái nào không được sử dụng và không được khai báo?".

Maven sử dụng Object WebASM khuôn khổ phân tích mã byte thô của bạn. Nó đi qua tất cả các lớp của bạn và sau đó xây dựng một danh sách của tất cả các lớp học mà các tài liệu tham khảo. Đó là cách làm.

Để làm gì, tôi sẽ không khuyên bạn nên loại bỏ "phụ thuộc không được sử dụng, tuyên bố" trừ khi bạn hoàn toàn chắc chắn rằng họ thực sự không sử dụng.

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