Tôi gần đây đã trở thành một fan hâm mộ lớn của Maven để kiểm soát chu kỳ xây dựng cho ứng dụng của tôi. Tuy nhiên tôi đã gặp phải một số cạnh thô với quản lý phụ thuộc của Maven. Tôi tự hỏi nếu đây là những hạn chế của các công cụ và mô hình, tệ nạn cần thiết của quản lý dependancy, hoặc nếu tôi "m chỉ sử dụng công cụ này không đúng cách.quản lý phụ thuộc với maven
Đầu tiên là vấn đề phụ thuộc bắc cầu. Theo tôi được biết , nếu bạn cung cấp một sự phụ thuộc, Maven sẽ lần lượt tìm thấy bất kỳ phụ thuộc của phụ thuộc mà đó là tuyệt vời, nhưng đối với nhiều người phụ thuộc của tôi, điều này đã không làm việc Ví dụ, bao gồm Hibernate trong dự án của tôi:..
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.3.2.GA</version> </dependency>
Kết quả trong một thiếu phụ thuộc của slf4j.Tôi cần phải tự thêm phụ thuộc này mà tôi giả định sẽ là công việc của Maven.Cùng cùng cho mùa xuân.Nếu tôi thêm Spring-MVC như là một phụ thuộc, không phải tất cả các phụ thuộc servlet cơ bản sẽ được thêm vào cho tôi (vì Spring-MVC sẽ cần thứ này)? Tôi đang đề cập đến các thư viện servlet, jsp, jstl.
Thứ hai là quản lý kho. Maven đi kèm với một kho lưu trữ chính mặc định, nhưng tôi thấy rằng trong nhiều trường hợp, kho lưu trữ này không được cập nhật. Ví dụ, nếu bạn muốn spring3, bạn phải tự thêm kho lưu trữ springource, và nếu bạn muốn hibernate 3.5+ bạn phải thêm kho jboss. Dường như đánh bại điểm quản lý phụ thuộc tự động khi bạn phải tự mình tìm kiếm kho lưu trữ chính xác. Săn bắn này sớm trở nên phức tạp. Ví dụ để thêm Spring3, bạn có thể muốn repo phát hành vào mùa xuân, repo xuân bên ngoài và repo cột mốc mùa xuân.
Liên quan chặt chẽ đến số 2 là đảm bảo bạn có phiên bản chính xác của tạo phẩm. Tôi đã bị đốt cháy nhiều lần bằng cách bao gồm các phiên bản sai của các tạo phẩm phụ thuộc cho một tạo phẩm nhất định. Ví dụ, phiên bản sai của aplet servlet/jsp/jstl cho spring3, hoặc phiên bản sai của apis persistence/annotation cho hibernate. Các kho lưu trữ được lấp đầy với nhiều phiên bản, một số có tên khó hiểu như productx-3.ga, productx-3-rc1, productx-3-SNAPSHOT, productx-3-cr, sản phẩm-3-beta, v.v. Một số trong số này là hiển nhiên (rc = phát hành ứng cử viên), nhưng nó có thể gây nhầm lẫn cố gắng để xác định thứ tự của các phiên bản này.
Cuối cùng, vấn đề thuộc loại phụ thuộc. Tôi có lẽ chỉ không hiểu điều này đủ tốt, nhưng nhiều hiện vật repo là loại "pom" không "jar". Một vài lần tôi đã thêm một jar phụ thuộc vào dự án của tôi chỉ để tìm hiểu tại thời điểm xây dựng mà repo jar không thực sự tồn tại (ví dụ là org.hibernate ejb3-persistence trong repo jboss).
Với một số thử nghiệm, tôi thường có thể xây dựng để làm việc, nhưng quản lý phụ thuộc nói chung phức tạp này? Tôi vẫn thích cách tiếp cận này để thêm thủ công các tệp jar vào dự án của tôi, nhưng tôi sẽ quan tâm để tìm hiểu cách cải thiện các kỹ năng quản lý phụ thuộc của maven của tôi.
cảm ơn tuyệt vời vì câu trả lời. Bạn có thể xây dựng trên ý tưởng về sự phụ thuộc tùy chọn không? Với tôi điều này không rõ ràng, hoặc là bạn có sự phụ thuộc hay bạn không. Nếu bạn không có nó, hơn Maven nên lấy nó, phải không? Hoặc là trường hợp, một số usecases cho một artifact không yêu cầu phụ thuộc đó, trong trường hợp đó sẽ có ít điểm int bao gồm nó (ví dụ nó sẽ là vô nghĩa để bao gồm hibernate-chú thích nếu bạn không sử dụng chú thích trong dự án của bạn). –
Phụ thuộc tùy chọn là phụ thuộc được yêu cầu bởi cấu hình. Một thư viện mạng có thể khai báo một thư viện gộp nó phụ thuộc vào như một phụ thuộc tùy chọn; để chỉ những người muốn bật tính năng tổng hợp mới được yêu cầu tải xuống các phụ thuộc bổ sung. – notnoop
Nếu bạn sử dụng nhật thực, plugin m2eclipse là _really_ tốt để xem cây phụ thuộc. –