Lời nói đầu
当我们在开发项目时,有时需要用到外部依赖组件,例如当我们需要Json序列化的时候需要用到FastJson组件,我们可以通过下载对应jar包加载到项目中。但当一个大的项目同时需要依赖各种各样的外部服务,就存在着配置繁琐、依赖冲突等问题,因此可以通过maven来完成对应的依赖管理功能.
1、Settings配置
settings.xml用来配置maven项目中的各种参数文件,包括本地仓库、远程仓库、私服、认证等信息.
1.1 配置概述
1.1.1 全局settings、用户setting、pom的区别
- 全局 settings.xml 是 maven 的 全局配置文件 ,一般位于${maven.home}/conf/settings.xml,即maven文件夹下的conf中。
- 用户 setting是maven的 用户配置文件 ,一般位于${user.home}/.m2/settings.xml,即每位用户都有一份配置文件。
- pom.xml 文件是 项目配置文件 ,一般位于项目根目录下或子目录下。
配置优先级从高到低:pom.xml > 本地 settings > 全局 settings 。
如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的.
1.1.2 仓库【重要】
如前言所述,我们依赖的外部服务是需要有地方进行存储的,而存储的地方就称之为仓库。其中仓库又分为本地仓库、中央仓库、镜像仓库、私服.
其对应关系为:
(1)本地仓库
当项目在本地编译或运行时,直接加载本地的依赖服务无疑是最快的。默认情况下,不管在Window还是Linux下,每个用户在自己用户目录下都有一个路径名为.m2/repository/的仓库目录.
而原始的本地仓库是为空的,因此maven需要知道一个网络上的仓库,在本地仓库不存在时前往下载网络上的仓库,也就是远程仓库.
(2)中央仓库
当maven未配置时,会默认请求maven的中央仓库,中央仓库包含了这个世界上绝大多数流行的开源java构件,以及源码、作者信息、SCM,信息、许可证信息等,每个月这里都会接受全世界java程序员大概1亿次的访问,它对全世界java开发者的贡献由此可见一斑.
但是由于最常见的例如网络原因等,国外的中央仓库使用起来并不顺利,因此就有了下载地址为国内的中央仓库,也就是镜像仓库.
(3)镜像仓库
总结来说,镜像仓库就是将国外的中心仓库复制一份到国内,这样一来下载速度以及访问速度都将很快.
(4)私服
一般来说中央仓库或者镜像仓库都能满足我们的需求,但是当我们在公司内合作开发代码时,可能因为系统保密性原因,有一些其他同事开发的外部依赖只希望能够被本公司的人使用,而如果上传到镜像仓库则保密性就不复存在了。因此私服最主要的功能时存储一些公司内部不希望被公开的依赖服务.
1.2 settings配置详解
settings.xml配置了本地全局maven的相关配置.
以下是一份seetings.xml的文件配置顶级元素.
1.2.1 Kho lưu trữ cục bộ
Được sử dụng để xác định vị trí của kho địa phương.
D:/Maven/Kho lưu trữ
1.2.2 Chế độ tương tác
Liệu maven có cần tương tác với người dùng để lấy đầu vào hay không. Mặc định là đúng.
ĐÚNG VẬY
1.2.3 sử dụngPluginRegistry
Maven có cần sử dụng tệp plugin-registry.xml để quản lý các phiên bản plugin không.
SAI
1.2.4 ngoại tuyến
Được sử dụng để xác định xem có vận hành maven ở chế độ ngoại tuyến hay không.
Khi hệ thống không thể kết nối Internet, hệ thống có thể chạy ngoại tuyến thông qua cấu hình phụ.
SAI
1.2.5 máy chủ
Khi sử dụng máy chủ riêng của maven, một số máy chủ riêng cần định cấu hình thông tin xác thực và bạn cần điền cấu hình tương ứng tại đây. Sở dĩ nó không được viết bằng pom.xml là vì nhìn chung các dự án cũng sẽ tải pom.xml lên khi tải lên kho mã, và setting.xml thường nằm cục bộ trên người dùng nên tương đối an toàn.
... server001 my_login my_password ${usr.home}/.ssh/id_dsa some_passphrase 664 775 ...
1.2.6 gương [Quan trọng]
Được sử dụng để cấu hình kho gương tương ứng.
Nếu kho X có thể cung cấp tất cả nội dung được lưu trữ trong kho Y thì X có thể được coi là tấm gương phản chiếu của Y. Ai đã sử dụng Maven đều biết rằng kho trung tâm nước ngoài sử dụng quá chậm vì lý do mạng nên cần chọn hình ảnh trong nước. Tôi khuyên bạn nên sử dụng hình ảnh Alibaba Cloud trong nước. Hình ảnh đám mây của Alibaba: Cấu hình rất đơn giản. Sửa đổi tệp settings.xml trong thư mục conf và thêm cấu hình hình ảnh sau:
alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ trung tâm alimaven1 aliyun maven1 http://maven.aliyun.com/nexus/content/groups/public/ *
Trong số đó, id và tên được sử dụng để xác định kho duy nhất, url là địa chỉ kho nhân bản và mirrorOf được sử dụng để khớp với nhân bản được sử dụng khi yêu cầu kho nào phụ thuộc vào nó.
Dưới đây là các tùy chọn khác nhau cho cấu hình .
-
*
: Phù hợp với tất cả các kho lưu trữ từ xa.
-
bên ngoài:*
: Phù hợp với tất cả các kho lưu trữ từ xa, ngoại trừ những kho sử dụng localhost và những kho sử dụng giao thức file://. Nghĩa là, khớp tất cả các kho lưu trữ từ xa không có trên máy này.
-
repo1,repo2
: So khớp các kho lưu trữ repo1h và repo2. Sử dụng dấu phẩy để phân tách nhiều kho lưu trữ từ xa.
-
*,!repo1
: Khớp tất cả các kho lưu trữ từ xa ngoại trừ repo1. Sử dụng dấu chấm than để loại trừ kho lưu trữ khỏi khớp.
Cần lưu ý rằng do kho nhân bản chặn hoàn toàn kho nhân bản nên khi kho nhân bản không ổn định hoặc ngừng phục vụ, Maven sẽ vẫn không thể truy cập vào kho nhân đôi và do đó sẽ không thể tải xuống các thành phần.
Ngoài ra, maven đọc cấu hình nhân bản từ trên xuống dưới nên hãy cấu hình * cẩn thận, vì nếu kho nhân bản đầu tiên được cấu hình với cờ như vậy thì ngay cả khi kho không có phụ thuộc tương ứng, nó sẽ không Sẽ truy vấn xuôi dòng.
1.2.7 proxy
Được sử dụng để cấu hình proxy.
... myproxy true http proxy.somewhere.com 8080 proxyuser somepassword *.google.com|ibiblio.org ...
1.2.8 hồ sơ [Quan trọng]
Danh sách các cấu hình bản dựng có thể được điều chỉnh dựa trên các thông số môi trường. Được sử dụng để xác định một tập hợp các hồ sơ.
Cấu hình trong phần nhìn thấy là phiên bản được cắt bớt của thành phần cấu hình trong pom.xml.
Nó chứa các phần tử id, kích hoạt, kho lưu trữ, pluginRepositories và thuộc tính. Phần tử hồ sơ ở đây chỉ chứa năm phần tử phụ này vì chúng tôi chỉ quan tâm đến toàn bộ hệ thống xây dựng (đây là vai trò của tệp settings.xml), chứ không phải cài đặt mô hình đối tượng dự án riêng lẻ. Nếu một cấu hình trong settings.xml được kích hoạt, giá trị của nó sẽ ghi đè bất kỳ cấu hình nào khác được xác định trong pom.xml có cùng id.
(1)kho lưu trữ
Xác định danh sách các kho lưu trữ từ xa sẽ được sử dụng khi cấu hình tương ứng với thuộc tính này được kích hoạt.
codehausSnapshots Ảnh chụp nhanh Codehaus false luôn luôn cảnh báo mặc định
(2)tính chất
Xác định một tập hợp các thuộc tính mở rộng, hợp lệ khi cấu hình tương ứng được kích hoạt.
${user.home}/our-project
(3)nhận dạng
Mã định danh duy nhất trên toàn cầu Nếu một cấu hình trong settings.xml được kích hoạt, giá trị của nó sẽ ghi đè bất kỳ cấu hình nào khác được xác định trong pom.xml có cùng id.
(4)Kho lưu trữ plugin
Tương tự như kho lưu trữ, nhưng thẻ này xác định kho lưu trữ từ xa của trình cắm.
(5)kích hoạt
Các điều kiện kích hoạt việc kích hoạt hồ sơ này.
false 1.5 Windows XP < family>Windows x86 mavenVersion 2.0.3 ${basedir}/file2.properties ${basedir}/file1.properties
1.2.9 Hồ sơ hoạt động
Cấu hình được kích hoạt thủ công khi chạy.
Phần tử này chứa một tập hợp các phần tử activeProfile, mỗi phần tử activeProfile chứa một id hồ sơ. Bất kỳ id hồ sơ nào được xác định trong activeProfile sẽ được kích hoạt hồ sơ tương ứng bất kể cài đặt môi trường. Nếu không có hồ sơ phù hợp, không có gì xảy ra.
env-test
1.2.10 Ba cách kích hoạt hồ sơ [Quan trọng]
Có hai cách để kích hoạt hồ sơ được đề cập ở trên và có một cách khác để kích hoạt hồ sơ thông qua dòng lệnh.
(1) Kích hoạt thông qua ActiveProfiles
Như trong câu hỏi 1.2.9, nhiều cấu hình có thể được kích hoạt cùng lúc.
(2) Thông qua kết quả kích hoạt
Chẳng hạn như câu hỏi 1.2.8 (5).
(3) Kích hoạt thông qua dòng lệnh
Đây cũng là phương pháp chúng tôi thường sử dụng, ví dụ:
mvn-P
Chúng ta có thể chỉ định cấu hình của các môi trường khác nhau trong pom.xml hoặc setting.xml và kích hoạt cấu hình tương ứng thông qua phương pháp dòng lệnh trên khi biên dịch và xây dựng các dự án khác nhau. Ví dụ: trong môi trường phát triển:
gói mvn -P dev
Các dự án trong môi trường vòng lặp mở có thể được đóng gói.
1.3 Hỏi & Đáp
1.3.1 Mối quan hệ giữa mirror và kho lưu trữ [Quan trọng]
Như bạn có thể thấy ở trên, cả thẻ kho lưu trữ và thẻ nhân bản đều xác định vị trí của một kho từ xa. Vậy khi một phần phụ thuộc tồn tại trong hai kho cùng lúc, phần phụ thuộc nào sẽ được tải trước?
Ở đây chúng ta cần giải thích các bước để maven tải kho lưu trữ thực sự hoạt động.
- Trước tiên, hãy lấy bộ sưu tập kho lưu trữ trong pom.xml, sau đó lấy các phần tử nhân bản trong setting.xml.
- Nếu kho lưu trữ
nhận dạng
và gương gươngCủa
Nếu các giá trị giống nhau, máy nhân bản sẽ thay thế kho lưu trữ.
- Nếu không tìm thấy máy nhân bản tương ứng trong kho lưu trữ, nó sẽ tự sử dụng.
- Bằng cách này, bạn có thể có được bộ sưu tập kho lưu trữ hoạt động cuối cùng. Có thể hiểu mirror là bản sao của kho tương ứng với id.
Mirror tương đương với một trình chặn, nó sẽ chặn kho lưu trữ được khớp bởi mirrorOf. Về nguyên tắc khớp, hãy tham khảo 1.2.6 Sau khi khớp, nó sẽ được thay thế bằng url được xác định trong bản sao của kho lưu trữ.
Không có cấu hình gương.
Gương được cấu hình.
2. Giải thích chi tiết về Pom.xml
Trong chương trước, setting.xml đã xác định cấu hình phụ thuộc có liên quan của dự án chung trong một môi trường nhất định, trong khi pom.xml đã xác định cụ thể cấu hình phụ thuộc của một dự án nhất định.
2.1 phần tử pom
2.1.1 Thông tin cơ bản
4.0.0 com.companyname.project-group < !-- ID duy nhất của dự án có thể có nhiều dự án dưới một groupId, được phân biệt bằng ArtifactId --> dự án 1.0 jar các phụ thuộc token www.funtl.com
Thông tin cơ bản tương đối dễ hiểu và chủ yếu xác định các hướng dẫn cấu hình có liên quan của dự án này, chẳng hạn như tọa độ duy nhất, phiên bản, giới thiệu dự án, v.v.
2.1.2 phần phụ thuộc [Quan trọng]
(1)sự phụ thuộc
Phần tử này xác định thông tin phụ thuộc có liên quan được yêu cầu trong dự án và cũng là một trong những phần tử quan trọng nhất.
org.apache.maven maven-artifact 3.8.1 spring-core org.springframework true test
(2) Cách giải quyết vấn đề chuyển giao phụ thuộc hoặc xung đột phiên bản gói jar
Nhìn chung có hai cách để giải quyết các vấn đề trên:
- Khi chúng tôi đóng vai trò là nhà cung cấp dịch vụ phụ thuộc, chúng tôi có thể chuyển
Thẻ loại trừ các dịch vụ mà bạn không muốn cung cấp.
... sample.ProjectB Project-B 1.0 true
Dịch vụ A của chúng tôi đề cập đến dịch vụ B phụ thuộc bên ngoài Lúc này có A -> B. Khi người khác nhắc đến chúng tôi thì có C -> A -> B. Nếu lúc này A của chúng tôi không muốn người khác tham khảo. dựa vào B khi cung cấp dịch vụ bên ngoài, bạn có thể thêm thẻ vào true khi tham chiếu B, để khi C phụ thuộc vào A thì B sẽ không được đưa vào. Nếu C muốn sử dụng các dịch vụ liên quan của B tại thời điểm này thì nó cần gọi rõ ràng các dịch vụ liên quan của B trong pom.
- Khi chúng ta là người dùng dịch vụ phụ thuộc, chúng ta có thể chuyển
Để xóa các dịch vụ khác mà chúng tôi không muốn phụ thuộc vào gói phụ thuộc của mình.
Nếu dịch vụ A của chúng tôi phụ thuộc vào dịch vụ B tại thời điểm này và dịch vụ B phụ thuộc vào dịch vụ C thì có A -> B -> C. Vì một số lý do, chẳng hạn như xung đột gói jar, chúng tôi không muốn phụ thuộc vào phiên bản của dịch vụ C trong A. , bạn có thể loại bỏ các phần phụ thuộc có liên quan của C khi gọi dịch vụ B, sau đó sử dụng phiên bản C có liên quan trong A.
... sample.ProjectB Project-B 1.0 sample.ProjectC Project-C sample.ProjectC Project-C 2.0
2.1.3
Khi có nhiều mô-đun trong một dịch vụ, mỗi mô-đun phụ có thể tham chiếu cùng một gói jar. Tuy nhiên, nếu phiên bản được duy trì trong pom của mô-đun phụ thì tất cả các phiên bản tệp pom cần phải được sửa đổi khi cần nâng cấp. Maven cung cấp một phương thức kế thừa để giải quyết vấn đề này.
org.aspectj aspectjweaver 1.0. 0
Xác định các phần phụ thuộc và phiên bản mà pom con yêu cầu trong của pom gốc.
org.springframework.boot spring-boot-starter-parent< /artifactId> < phiên bản>1.5.10.RELEASE org.aspectj aspectjweaver
Khi pom của chúng ta có các phần tử xác định pom gốc, chúng ta có thể chỉ định các phần phụ thuộc bắt buộc mà không cần chỉ định phiên bản của chúng. Maven sẽ giúp chúng ta tìm thông tin phiên bản có liên quan trong pom gốc.
2.1.4 tính chất
Các thuộc tính chủ yếu được sử dụng để xác định các hằng số, được sử dụng thông qua ${value}.
1.8 UTF-8 UTF-8 Finchley.RELEASE 2.0.1 2.10.1 org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import io.zipkin.java zipkin ${zipkin.version}
Ngoài ra, Maven còn định nghĩa một số thuộc tính thường dùng thông qua quy ước hơn là cấu hình.
tài sản |
sự định nghĩa |
${dựa trên} |
Lưu trữ pom.xml và tất cả các thư mục con |
${basedir}/src/main/java |
Mã nguồn dự án java |
${basedir}/src/main/resource |
Tài nguyên dự án, chẳng hạn như tệp thuộc tính, springmvc.xml |
${basedir}/src/main/webapp/WEB-INF |
Thư mục tệp ứng dụng web, thông tin dự án web, chẳng hạn như lưu trữ web.xml, hình ảnh cục bộ và các trang xem jsp |
${basedir}/mục tiêu |
Thư mục đầu ra gói |
${dự án.phiên bản} |
Phiên bản dự án |
${dự án.groupId} |
nhóm dự án |
2.1.5 tài nguyên
Thẻ tài nguyên được sử dụng để xác định các tệp yêu cầu biên dịch bổ sung khi dự án được biên dịch và chạy. Ví dụ: giới thiệu các gói jar theo cách thủ công và các môi trường hoạt động khác nhau tương ứng với các cấu hình khác nhau.
src/main/resources true **/*.fxml **/*.yaml src/main/profiles/dev src/main/profiles/beta src/main/profiles/pre --> src/main/profiles/product true **/*.fxml lib BOOT-INF/lib/ **/*.jar
2.1.6 hồ sơ
Khác với cấu hình trong setting.xml (tham khảo 1.2.8), cấu hình trong pom có nhiều thẻ hơn để mô tả một tập hợp môi trường. Về mặt chức năng, setting.xml thường được sử dụng để xác định các kho từ xa khác nhau, trong khi hồ sơ trong pom thường được sử dụng để xác định dự án hiện tại thuộc về môi trường nào. Sau đây là tập hợp các hồ sơ phổ biến trong pom.
dev true dev test test src/main/$ { project.active true **/*.fxml
Ngoài ra, các môi trường khác nhau thường được kích hoạt thông qua lệnh mvn -P dev/beta/pre/product và các cấu hình cũng có thể được kích hoạt thông qua các phương pháp khác. Xem phần 1.2.10 để biết chi tiết.
Tất nhiên, profile trong pom không chỉ có chức năng chỉ định môi trường biên dịch mà còn có thể chỉ định các chức năng khác như kho từ xa.
2.1.6 mô-đun
Khi có nhiều mô-đun trong dự án của chúng ta, nếu muốn đóng gói chúng một cách riêng biệt, chúng ta cần thực thi lệnh maven tương ứng trong mỗi mô-đun. Tuy nhiên, các dịch vụ phụ hoặc dịch vụ phẳng có thể được tổng hợp thông qua thẻ và chỉ có thẻ. service cần được đóng gói và các mô-đun con tương ứng của nó sẽ được đóng gói cùng một lúc.
springmybatis ../utils
3. Giải quyết vấn đề null:jrdp-common:null:jar
3.1 Vấn đề không tìm thấy gói hàng
Một lần, khi chúng tôi đang phát triển các hàm, chúng tôi đã tham chiếu gói jar của một hệ thống Fuxi khác trong dự án của mình, nhưng khi biên dịch nó trong môi trường tiền phát hành, chúng tôi nhận thấy rằng bản dựng không thành công vì điều này.
Vì lúc đó dự án sử dụng kho riêng của Jingdong nên phản ứng đầu tiên của chúng tôi là lục soát trong kho và phát hiện gói lọ đang ở trong kho.
Sau khi phát hiện ra rằng gói jar không tồn tại không phải là vấn đề phổ biến nhất, chúng tôi bắt đầu phân tích nguyên nhân lỗi và phát hiện ra rằng gói jrdp-common trong lỗi không được chúng tôi tham chiếu trực tiếp mà được tham chiếu trong jar mà chúng tôi đã tham chiếu và có giá trị null :jrdp-common:null:jar Có thể suy đoán rằng mặt trước phải là groupID và phiên bản.
Giả sử rằng dự án của chúng tôi là dự án A và dự án được tham chiếu là dự án B, nghĩa là A->B->jrdp-common.
Vì vậy, chúng tôi mở dự án B và xem cấu trúc pom của B.
Người ta nhận thấy rằng gói jrdp-common thực sự đã được tham chiếu trong pom của dự án B, nhưng phiên bản không được chỉ định vì nó kế thừa gói xx-parent. Chúng tôi đã tìm thấy số phiên bản được chỉ định trong gói này, vì vậy dự án đã bị loại trừ. Không có vấn đề gì khi chỉ định nhóm id và số phiên bản.
Tại thời điểm này, chúng tôi dường như đang gặp khó khăn về vấn đề này, nhưng chúng tôi nhận thấy rằng trước đây chúng tôi cũng đã có gói này trên một máy chủ riêng khác, vì vậy dường như không có vấn đề gì khi trích dẫn nó trên một máy chủ riêng khác. Chúng tôi đã kiểm tra pom trên máy chủ riêng tư. server. Tệp được tìm thấy giống với dự án.
Sau đó, chúng tôi chợt nghĩ rằng có thể có vấn đề với những chiếc túi trong kho, và quả nhiên điều đó đã trở thành sự thật.
Cả số phiên bản gốc và số phiên bản đều không được chỉ định, vì vậy chúng tôi đã sửa đổi pom của phiên bản này và vấn đề đã được giải quyết.
Tóm tắt: Vì hệ thống của chúng tôi đã được nhiều nhóm chuyển giao và tiếp quản nên có thể có rất nhiều cạm bẫy ở một số nơi. Vấn đề như thế này có lẽ là do nhóm trước đó đã tải lên một số gói jar có vấn đề, khiến các gói phụ thuộc không khả dụng. không có vấn đề gì với máy chủ riêng mà chúng tôi đã sử dụng trước đây, chỉ khi chúng tôi sử dụng nhà kho lần này thì vấn đề mới xuất hiện.
Ngoài ra, vấn đề này không phổ biến nhưng khi nhóm id không thể trống, bạn có thể làm theo phương pháp này để khắc phục sự cố.
Tác giả: JD Technology Korea Kai.
Nguồn nội dung: Cộng đồng nhà phát triển đám mây JD.
Cuối cùng, bài viết về Hướng dẫn học nâng cao Maven này kết thúc tại đây. Nếu bạn muốn biết thêm về Hướng dẫn học nâng cao Maven, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!