Vấn đề của phương pháp phổ biến
Hầu hết các câu trả lời bạn sẽ tìm thấy trên internet sẽ đề nghị bạn cài đặt phần phụ thuộc vào kho lưu trữ cục bộ của bạn hoặc chỉ định phạm vi "hệ thống" trong pom
và phân phối phần phụ thuộc với nguồn dự án của bạn. Nhưng cả hai giải pháp này đều thực sự thiếu sót.
Tại sao bạn không nên áp dụng phương pháp "Cài đặt vào Repo cục bộ"
Khi bạn cài đặt một phụ thuộc vào kho lưu trữ cục bộ của bạn, nó vẫn ở đó. Cổ vật phân phối của bạn sẽ hoạt động tốt miễn là nó có quyền truy cập vào kho lưu trữ này. Vấn đề là trong hầu hết các trường hợp, kho lưu trữ này sẽ nằm trên máy cục bộ của bạn, vì vậy sẽ không có cách nào để giải quyết sự phụ thuộc này vào bất kỳ máy nào khác. Rõ ràng làm cho tạo tác của bạn phụ thuộc vào một máy cụ thể không phải là một cách để xử lý mọi thứ. Nếu không, sự phụ thuộc này sẽ phải được cài đặt cục bộ trên mỗi máy làm việc với dự án đó, điều này không tốt hơn.
Tại sao bạn không nên áp dụng phương pháp "Phạm vi hệ thống"
Các lọ bạn phụ thuộc vào cách tiếp cận "Phạm vi hệ thống" không được cài đặt vào bất kỳ kho lưu trữ nào hoặc được đính kèm với các gói mục tiêu của bạn. Đó là lý do tại sao gói phân phối của bạn sẽ không có cách giải quyết sự phụ thuộc đó khi được sử dụng. Điều đó tôi tin là lý do tại sao việc sử dụng phạm vi hệ thống thậm chí còn bị phản đối. Dù sao, bạn không muốn dựa vào một tính năng không dùng nữa.
Giải pháp kho lưu trữ trong dự án tĩnh
Sau khi đặt cái này vào pom
:
<repository>
<id>repo</id>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>file://${project.basedir}/repo</url>
</repository>
đối với mỗi tạo phẩm có id nhóm có dạng x.y.z
Maven sẽ bao gồm vị trí sau trong thư mục dự án của bạn để tìm kiếm các tạo phẩm:
repo/
| - x/
| | - y/
| | | - z/
| | | | - ${artifactId}/
| | | | | - ${version}/
| | | | | | - ${artifactId}-${version}.jar
Để giải thích thêm về điều này, bạn có thể đọc bài viết trên blog này .
Sử dụng Maven để cài đặt để dự án repo
Thay vì tạo cấu trúc này bằng tay, tôi khuyên bạn nên sử dụng plugin Maven để cài đặt các lọ của bạn dưới dạng tạo tác. Vì vậy, để cài đặt một tạo phẩm vào kho lưu trữ trong dự án trong repo
thư mục thực thi:
mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]
Nếu bạn chọn phương pháp này, bạn sẽ có thể đơn giản hóa khai báo kho lưu trữ trong pom
:
<repository>
<id>repo</id>
<url>file://${project.basedir}/repo</url>
</repository>
Một kịch bản trợ giúp
Do việc thực thi lệnh cài đặt cho mỗi lib khá khó chịu và dễ bị lỗi, tôi đã tạo một tập lệnh tiện ích tự động cài đặt tất cả các tệp từ lib
thư mục vào kho lưu trữ dự án, trong khi tự động giải quyết tất cả siêu dữ liệu (groupId, artifactId và v.v.) từ tên của các tập tin. Kịch bản cũng in ra các phụ thuộc xml để bạn sao chép-dán vào pom
.
Bao gồm các phụ thuộc trong gói mục tiêu của bạn
Khi bạn có kho lưu trữ trong dự án của mình, bạn sẽ giải quyết được vấn đề phân phối các phụ thuộc của dự án với nguồn của nó, nhưng kể từ đó, tạo phẩm mục tiêu của dự án của bạn sẽ phụ thuộc vào các tệp không được xuất bản, vì vậy khi bạn cài đặt nó vào một kho lưu trữ nó sẽ có các phụ thuộc không thể giải quyết được.
Để đánh bại vấn đề này, tôi đề nghị đưa các phụ thuộc này vào gói mục tiêu của bạn. Điều này bạn có thể làm với Plugin hội hoặc tốt hơn với Plugin OneJar . Tài liệu chính thức về OneJar rất dễ nắm bắt.