2011-07-13 4 views
11

Có các công cụ nào sẽ cấu hình chính quy trình xây dựng của Maven để tôi có thể thấy nơi xây dựng dành hầu hết thời gian không?Hồ sơ Maven

Chúng tôi đang gặp sự cố liên quan đến Maven 3.0.3 và 3.0b1. Dự án của chúng tôi xây dựng nhanh hơn nhiều dưới 3.0b1 (3m30s) so với 3.0.3 (9m00s). Với 3.0b1, việc xây dựng nhanh hơn khoảng 63% (nếu toán học của tôi đúng).

Tôi đã thử tìm kiếm các so sánh hiệu suất và các vấn đề về hiệu suất liên quan đến Maven 3, nhưng không thể tìm thấy bất kỳ thứ gì.

CẬP NHẬT

tôi đã làm một số nghiên cứu nhiều hơn bằng cách nhìn vào các nguồn maven và đây là những gì tôi phát hiện ra:

Trong khi sử dụng jconsole, tôi thấy rằng hầu hết thời gian (trong 3.0.3) được chi tiêu bên trong DefaultProjectDependenciesResolver.java. Vì vậy, tôi đã tải xuống nguồn cho cả 3.0b1 và 3.0.3 để xem điều gì đang xảy ra. Tôi nhận thấy rằng trong 3.0.3 có hai phiên bản của lớp. Một là ở số org.apache.maven.project, còn số kia nằm trong số org.apache.maven. Nó cũng xuất hiện trong 3.0.3, trước đây đang được sử dụng. Trong khi bước qua đoạn code, tôi thấy rằng phần lớn thời gian là chi tiêu khi nó đạt đến tuyên bố này:

node = repoSystem.collectDependencies(session, collect).getRoot(); 

Trong 3.0b1, mã lệnh thực hiện:

ArtifactResolutionResult result = repositorySystem.resolve(request); 

Tôi cũng nhận thấy rằng respositorySystem là loại RepositorySystem và việc triển khai cụ thể là LegacyRepositorySystem. Tôi giả định rằng điều này đã được sử dụng trong khi Maven 3 là trong phiên bản beta cho đến khi thực hiện mới được tạo ra? Quay lại 3.0.3, phương pháp collectDependencies sống ở DefaultRepositorySystem.java là một phần của org.sonatype.aether.impl.internal. Điều này cuối cùng gọi collectDependencies bên trong DefaultDependencyCollector.java cũng là một phần của org.sonatype.aether.impl.internal. Tôi giả định rằng đây là cách đồ thị phụ thuộc được xây dựng.

Tôi đang tự hỏi đó là do cách thức các phụ thuộc của chúng tôi được cấu trúc. Có ai nhìn thấy loại hành vi này trước đây không?

CẬP NHẬT

Có một issue trong JIRA về vấn đề này cùng với một sửa chữa đề nghị. Tôi đã đăng các chi tiết như một câu trả lời.

CẬP NHẬT

Vấn đề là do phiên bản của ether mà được sử dụng trong maven 3.0.3 (1.11). Phiên bản 1,12 của aether khắc phục vấn đề này. Tôi đã kiểm tra nguồn để maven 3.0.3 và chỉnh sửa POM để thay đổi phiên bản của aether từ 1.11 thành 1.12. Sau đó tôi đã xây dựng maven từ nguồn và thay thế phiên bản hiện tại của tôi bằng phiên bản mà tôi đã tạo. Việc giảm thời gian xây dựng thật ấn tượng.

Nếu bạn không muốn xây dựng maven từ nguồn, bạn có thể thay thế thư viện aether nằm trong thư mục lib của maven bằng phiên bản 1.12. Điều đó cũng có tác dụng.

Tôi không chắc liệu thay đổi này có biến thành 3.0.4 hay không, bởi vì các nhà phát triển maven nói rằng có những thay đổi về cấp phép từ aether 1,11 đến 1,12, và vì vậy họ vẫn thảo luận về nó.

Trả lời

5

Maven chỉ là một ứng dụng Java đơn giản, vì vậy tôi khuyên bạn nên bắt đầu bằng công cụ lược tả chẳng hạn như YourKit hoặc JProfiler và phân tích hiệu suất thời gian chạy của nó. Bạn cũng có thể sử dụng JVisualVM để trích xuất thông tin hiệu suất thời gian chạy.


Tất cả trong tất cả, tôi tin rằng các nhà phát triển Maven muốn tìm hiểu về sự hồi quy hiệu suất này. Vui lòng mở một vé trong Maven Jira hoặc đăng trên Maven developers list

+0

Cảm ơn Robert! Tôi đã thử một phiên bản đánh giá của JProfiler và với sự giúp đỡ của điều đó và jconsole là làm thế nào tôi phát hiện ra nơi nó đã dành rất nhiều thời gian! Cảm ơn bạn đã cung cấp cho tôi liên kết đến danh sách nhà phát triển. Tôi sẽ đăng câu hỏi của tôi lên đó! –

+1

Robert, cảm ơn lần nữa vì đã chỉ cho tôi đúng hướng. Tôi đang bình luận với [một liên kết] (http://vivin.net/pub/maven-3.0.3-with-aether-1.12.zip) cho một phiên bản của maven đã được xây dựng với aether 1,12. –

+0

@Vivin - vui mừng khi thấy bạn đã giải quyết vấn đề của mình. –

2

Đối với câu hỏi chung về việc tạo bản dựng Maven, có Codehaus JIRA issue cung cấp bản vá để xuất thời gian thực thi của Mojos. Thật không may, nó chưa được bao gồm trong Maven.