sách gpt4 ăn đã đi

Maven进阶学习指南

In lại Tác giả: Tôi là chú chim nhỏ 更新时间:2023-06-26 22:34:19 26 4
mua khóa gpt4 giày nike

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 仓库【重要】

如前言所述,我们依赖的外部服务是需要有地方进行存储的,而存储的地方就称之为仓库。其中仓库又分为本地仓库、中央仓库、镜像仓库、私服.

其对应关系为:

hình ảnh.png

(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.

  1. 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.
  2. 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ữ.
  3. 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.
  4. 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.

hình ảnh

Gương được cấu hình.

hình ả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.

hình ảnh

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.

hình ảnh.png

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.

hình ảnh.png

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! .

26 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress