2010-03-24 21 views
12

OK, tôi nghĩ tôi hiểu làm thế nào để sử dụng Maven ...Làm cách nào để tạo một mô-đun Maven phụ thuộc vào mô-đun khác?

tôi có một dự án tổng thể M trong đó có tiểu dự án A, B, và C. C chứa một số chức năng phổ biến (giao diện chủ yếu) cần thiết bởi AB. Tôi có thể chạy mvn compile jar:jar từ thư mục gốc của dự án (thư mục M) và nhận các tệp JAR A.jar, B.jarC.jar. (Các phiên bản cho tất cả các hiện vật hiện 2.0-SNAPSHOT là.)

Các tập tin tổng thể pom.xml trong danh sách M thư mục C dưới thẻ <dependencyManagement> của nó, do đó AB có thể tham khảo C bằng cách chỉ bao gồm một tham chiếu, như vậy:

<dependency> 
    <groupId>my.project</groupId> 
    <artifactId>C</artifactId> 
</dependency> 

Cho đến nay, rất tốt. Tôi có thể chạy mvn compile từ dòng lệnh và mọi thứ hoạt động tốt. Nhưng khi tôi mở dự án trong NetBeans, nó phàn nàn với vấn đề: "Một số hiện vật phụ thuộc không có trong kho lưu trữ cục bộ", và nó cho biết phần tạo hình còn thiếu là C. Tương tự như vậy từ dòng lệnh, nếu tôi thay đổi thành các thư mục A hoặc B và cố gắng chạy mvn compile Tôi nhận được "Lỗi xây dựng: Không thể giải quyết hiện vật". Tôi mong đợi tôi có thể tự đi đến nơi C.jar của tôi được xây dựng và chạy mvn install:install-file, nhưng tôi muốn tìm một giải pháp cho phép tôi làm việc trực tiếp trong NetBeans (và/hoặc trong Eclipse bằng cách sử dụng m2eclipse).

Tôi đang làm gì sai?

Trả lời

22

Maven dựa vào khái niệm phụ thuộc nhị phân và giải quyết chúng thông qua kho lưu trữ cục bộ. Nói cách khác, bạn cần phải "cài đặt" gói trong kho lưu trữ cục bộ của bạn nếu bạn có phụ thuộc giữa chúng, biên dịch và mã đóng gói là không đủ. Và để làm như vậy, bạn cần chạy install (sẽ cài đặt gói vào kho lưu trữ cục bộ, để sử dụng làm phụ thuộc trong các dự án khác tại địa phương).

Side lưu ý: bạn không nên gọi mvn compile jar:jar nhưng thích mvn package.Trước tiên, chạy giai đoạn package sẽ kích hoạt tất cả các giai đoạn trước package (bao gồm compile) và package chính nó. Thứ hai, chạy package sẽ gọi jar:jar hoặc war:war, v.v. tùy thuộc vào giá trị <packaging> của dự án (kiểm tra introduction to the lifecycle để biết thêm chi tiết về điều này). Đó là một trong những sức mạnh to lớn của Maven: bạn không cần phải biết liệu dự án là một JAR, một WAR, một EJB, vv và để chạy mục tiêu thích hợp để đóng gói nó. Chỉ cần chạy giai đoạn chuẩn hóa package và Maven sẽ thực hiện công việc (sử dụng các ràng buộc mục tiêu mặc định).

Đó là phần lý thuyết Maven. Bên trong IDE, mọi thứ có thể hơi khác để làm việc với Maven thuận tiện hơn. Các IDE có thể sử dụng các phụ thuộc dự án phụ thuộc dự án (tức là phụ thuộc vào mã bên trong IDE) thay vì phụ thuộc nhị phân để các thay đổi được thực hiện trong một dự án được hiển thị trong các mô-đun khác mà không phải chạy mvn install. Đây là trường hợp của Eclipse + M2Eclipse. Và điều này cũng áp dụng cho NetBeans trong điều kiện sau đây (xem Dependency Management):

Hint: If you open a project that other projects depend on, the icon in other projects changes to a "maven project" icon to denote that the IDE knows about link between the projects. However such a link is only established when the groupId, artifactId and version all match in the dependency and project declaration. Frequently occurring problem is that you change an API signature in your library project, but the application is not picking up. Often it's caused by the fact that the application is using an older version of the library artifact. The artifact icon can help you track down these problems.

+0

Cảm ơn. Tôi biết rằng về việc sử dụng 'mvn package' thay vì' mvn compile', nhưng cảm ơn lời nhắc nhở. Tuy nhiên, liên kết "Thực hành tốt nhất Maven" tại wiki.netbeans.org đặc biệt hữu ích, vì vậy tôi đánh dấu câu trả lời này là được chấp nhận. –

+0

@Daniel Bạn được chào đón. Nhưng bên lưu ý là nhiều hơn về 'mvn package' vs' mvn jar: jar' :) Rất vui khi bạn tìm thấy liên kết hữu ích. –

+0

Có thể chạy 'install' của mô-đun như một phần của' biên dịch' của cha mẹ không? –

6

Bạn cần chạy mvn install thay vì mvn compile. Mục tiêu install sẽ sao chép bình được xây dựng vào kho lưu trữ cục bộ sau khi biên dịch và đóng gói nó. Nếu bạn chỉ chạy biên dịch, nó sẽ chỉ biên dịch các tệp lớp vào thư mục target và không cung cấp chúng cho các dự án khác. Trong Eclipse, nếu bạn nhập một pom từ cấp cao nhất, nó sẽ nhập các dự án con vào các dự án Eclipse riêng biệt và thiết lập các phụ thuộc của các dự án liên quan sau đó thiết lập đường dẫn lớp của mỗi dự án phụ thuộc vào người khác. Tôi không quen thuộc với Netbeans nhưng tôi khá chắc chắn có một số cách để làm điều tương tự.

3

liên kết netbeans dự án với nhau theo nội dung kho lưu trữ cục bộ, do đó, việc cài đặt mvn là cần thiết trong hầu hết các trường hợp.

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