2011-11-10 34 views
6

Tôi có một dự án với một triệu lọ (tốt, rất nhiều). Họ đến với tôi bởi maven, và tôi chỉ sử dụng một bộ nhỏ chức năng. Vì lợi ích sạch, tôi đã tự hỏi với lọ tôi có thể làm mà không có.Xác định các lọ chưa sử dụng bằng mã vùng?

Suy nghĩ đầu tiên của tôi là chạy chương trình bằng công cụ bảo vệ mã và sau đó tìm các lớp được chạm vào.

Có ai đã làm điều này trước đây không? Hay có thủ đoạn thông minh hơn để đạt được điều tương tự?

+0

loại bỏ các lọ khỏi đường dẫn lớp từng người một thêm lại lần cuối trên e bị xóa khi đoạn mã bị hỏng –

+2

@ ratchet freak - Ý tưởng tồi sẽ không phát hiện các phụ thuộc thời gian gián tiếp trừ khi bản dựng bao gồm kiểm tra tích hợp hoàn chỉnh. –

+0

@ ratchet freak - Điều đó có thể hiệu quả, nhưng đó là sức mạnh vũ phu cuối cùng của tôi. – RobAu

Trả lời

4

Bạn có thể chạy dự án bằng tùy chọn -verbose:class VM. Thao tác này sẽ in cho tất cả các lớp đã tải nơi chúng được tải. Sử dụng một số ứng dụng phân tích cú pháp thông minh/grep/regexp sẽ cho phép bạn lọc các tên jar thành một tập hợp các mục duy nhất và cho bạn biết những gì được sử dụng.

Tôi nghĩ rằng điều này sẽ dễ dàng hơn vì nó sẽ tự động cho bạn biết nếu một lớp được sử dụng và nếu như vậy trong đó jar. Tất nhiên vấn đề với mã này và phạm vi bảo hiểm là bạn có thể xóa một lọ chỉ được sử dụng trong một số trường hợp ngoại lệ, nhưng trình biên dịch của bạn sẽ phàn nàn nếu bạn xóa một hoặc hai quá nhiều, để lại cho bạn (hầu hết không phải là quá phức tạp) nhiệm vụ phát hiện mà jar lớp là trong

có thể gợi ý khi sử dụng linux:.

java -verbose:class <your startup command here> | grep "\[Loaded" | grep -o "from .*\]" | cut -c 6- | sort | uniq

Nếu bạn không sử dụng linux, sau đó lưu vào một tập tin, có được một máy Linux và chạy trên Linux (hoặc sử dụng một cái gì đó để chạy lệnh bash trên windows)

+0

Cảm ơn, đây có lẽ là cách dễ nhất để đi. Tôi tự hỏi, như nhiều người sẽ có câu hỏi này, nếu ai đó đã có một số mã để làm điều này .. Đó là một bài tập tốt, nhưng tại sao tái tạo lại bánh xe .. – RobAu

+1

@RobAu Đã thêm một ví dụ cho Linux. Không lý tưởng, nhưng không phải là lừa. – Thirler

0

Cân nhắc sử dụng công cụ đã tồn tại, như Dependency Finder hoặc JDepend.

Giống như với tất cả các công cụ phân tích tĩnh, việc sử dụng các khung phản chiếu hoặc DI có thể loại bỏ điều này; Tôi đã sử dụng các công cụ tùy chỉnh sử dụng công cụ này và các yếu tố đầu vào khác để tìm ra mọi thứ, mặc dù nó vẫn tĩnh.

Để biết thông tin sử dụng toàn thời gian, bạn có thể sử dụng giải pháp của Thirler, mặc dù có hay không hoàn thành có thể phụ thuộc vào đường dẫn mã nào được theo sau.

0

Bạn có thể sử dụng Maven Dependency Plugin để phân tích cây phụ thuộc của mình. Nó cũng sẽ gợi ý cho bạn những phụ thuộc được tải xuống/thêm vào dự án của bạn bởi vì chúng phụ thuộc vào bất kỳ lọ nào khác.

Chạy một số mvn dependency:tree và xem bạn có đang sử dụng một vài lọ không được yêu cầu không.

+0

Điều đó sẽ không hoạt động, vì tôi cần hành vi năng động, không phải là phân tích tĩnh. – RobAu

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