日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Maven的依赖(Dependency)

發布時間:2023/12/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Maven的依赖(Dependency) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

環境

  • 操作系統: Ubuntu 20.04
  • JDK: 17
? ~ java -version java version "17.0.1" 2021-10-19 LTS Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39) Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)
  • Maven: 3.8.5
? ~ mvn -v Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0) Maven home: /home/ding/Downloads/apache-maven-3.8.5-bin/apache-maven-3.8.5 Java version: 17.0.1, vendor: Oracle Corporation, runtime: /home/ding/Downloads/jdk-17.0.1 Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "5.13.0-39-generic", arch: "amd64", family: "unix"

背景

在Maven世界里,每一個構件(artifact)都有唯一的坐標(Coordinate)。坐標是用一系列元素來定義的:

  • groupId
  • artifactId
  • version
  • packaging
  • classifier

其中, groupId 、 artifactId 、 version 是必需的, packaging 是可選的(默認值為 jar ),而 classifier 是不能直接定義的。

問題

在POM中,我們可以定義依賴關系,例如:

............<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>............<dependencies> ............

被依賴的artifact(本例中是 spring-boot-starter-web ),顯然也需要 groupId 、 artifactId 、 version 來唯一標識,然而,這里只有 groupId 和 artifactId ,并沒有 version 。這是怎么回事呢?

帶著這個問題,我們來看一下Maven的依賴(dependency)。

聚合和繼承

一個項目(project)的開發,通常采用“模塊化開發”的方式,項目是由多個模塊(module)所組成,模塊秉承“高內聚,低耦合”的原則。例如開發團隊分為多個小組,每組只專注于各自所負責的模塊的開發和調試。但項目作為一個整體,需要在總體上進行管理和構建。

Maven提供了 聚合 和 繼承 這兩個概念:

  • 聚合:把各個模塊聚合在一起構建;
  • 繼承:抽取各個模塊相同的依賴和插件等配置,以簡化配置,方便維護;

聚合

聚合比較簡單,就是把多個模塊在一起構建。例如,我們有 module1 和 module2 兩個模塊。為了把它們聚合在一起,我們再創建一個額外的 aggregator 模塊。該模塊本身作為一個Maven項目,有自己的pom文件,但是它不涉及項目的具體業務邏輯,所以沒有src等目錄。

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example.demo0402</groupId><artifactId>aggregator</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><name>Aggregator</name><modules><module>module1</module><module>module2</module></modules> </project>

該POM的核心配置是:

  • packaging :必須是 pom ;
  • modules :要聚合的模塊。注意此處的每一個值都是針對當前pom文件的相對路徑。通常可以令目錄名與其artifact名一致,以便于理解和快速定位,不過也不強制,反正記住這里要寫目錄名;

一般我們把聚合模塊作為module1、module2等模塊的父一級目錄,即:

? test0402 tree . └── aggregator├── module1│ ├── pom.xml│ └── src│ ├── main│ │ ├── java│ │ └── resources│ └── test│ └── java├── module2│ ├── pom.xml│ ├── src│ │ ├── main│ │ │ ├── java│ │ │ └── resources│ │ └── test│ │ └── java└── pom.xml

在build aggregator 的時候,可以看到構建的細節,例如:

? aggregator mvn clean install [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] module1 [jar] [INFO] module2 [jar] [INFO] Aggregator [pom] ............ [INFO] Reactor Summary for Aggregator 0.0.1-SNAPSHOT: [INFO] [INFO] module1 ............................................ SUCCESS [ 11.691 s] [INFO] module2 ............................................ SUCCESS [ 4.185 s] [INFO] Aggregator ......................................... SUCCESS [ 0.060 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 16.123 s [INFO] Finished at: 2022-04-03T17:48:02+08:00 [INFO] ------------------------------------------------------------------------

注意上面顯示的是各個模塊的 name ,而不是 artifactId 。

繼承

module1 和 module2 模塊有很多相同的配置,比如 groupId 和 version ,此外還有 spring-boot-starter-web 等三方依賴包也一樣。重復的配置顯然增加了維護成本,并帶來潛在的不一致風險。

Maven提供了繼承機制,來抽取重復的配置。這有點類似于面向對象的父子類關系,在父POM中定義一些配置以供子POM來繼承。

“父POM”與“聚合POM”有些相似之處:

  • POM的 packaging 必須為 pom ;
  • 不需要src目錄;

在 aggregator 目錄下創建一個 parent 目錄,然后在 parent 目錄里創建 pom.xml 文件,內容如下:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example.demo0402</groupId><artifactId>parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><name>Parent</name> </project>

有了父模塊, module1 和 module2 還必須顯式的聲明繼承關系。

以 module1 為例,在其pom.xml文件中添加如下內容:

<parent><groupId>com.example.demo0402</groupId><artifactId>parent</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../parent/pom.xml</relativePath></parent>

module1 可以刪除自己的 groupId 和 version 設置,默認會從父模塊繼承。這樣,就可以確保各個模塊始終保持相同的 groupId 和 version 。

注: relativePath 的默認值是 ../pom.xml ,即上一級目錄。

接下來,我們來把dependency抽取到父模塊。

若直接把子模塊中公共的dependency配置移到父模塊,固然OK,不過這種做法存在一個問題,如果以后再有新的子模塊(如 module3 ),而新的子模塊并不需要這些dependency,這就難辦了。

所以Maven提供了 dependencyManagement 元素。

  • 在父模塊中通過 dependencyManagement 元素聲明dependency;
  • 在子模塊中通過 dependency 元素引用所需的dependency;

在父模塊POM中添加如下內容:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.6</version></dependency></dependencies></dependencyManagement>

在子模塊POM的 dependencies 中添加如下內容:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

我們看到,子模塊的dependency只需指明 groupId 和 artifactId ,而無需指定 version 。這是因為完整的dependency信息是在父模塊的 dependencyManagement 定義的,所以子模塊只需通過 groupId 和 artifactId 來引用即可。

這種做法的好處是:

  • 統一性:所有dependency都由父模塊統一定義,確保子模塊使用的dependency版本一致;
  • 靈活性:子模塊只需引用自己所需的dependency;

有一種特殊的依賴范圍( scope ),叫做 import 。這種依賴通常指向一個POM,作用是將其 dependencyManagement 配置導入到當前的POM中。例如:

<dependencyManagement><dependencies><dependency><groupId>com.example.demo0402</groupId><artifactId>xxx</artifactId><version>0.0.1-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.example.demo0402</groupId><artifactId>yyy</artifactId><version>0.0.1-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency>............</dependencies></dependencyManagement>

常見做法是把依賴根據類型不同,生成多個POM(如上例中的 xxx 、 yyy 等),然后在父模塊中將其一一導入,以便“分而治之”。

聚合與繼承的關系

共同點

  • packaging 必須是 pom ;
  • 除了POM外并無src等實際內容;

區別

聚合繼承
目的為了方便快速構建整個項目為了消除重復配置
關系聚合POM知道被聚合的POM;被聚合的POM不知道聚合POM父POM不知道子POM;子POM知道父POM
關鍵字modules / module (父)parent (子), dependencyManagement (父)

集成

為了方便,通常可以把聚合POM和父POM合二為一,只用一個POM。具體例子參見代碼。

代碼

https://github.com/dukeding/test0402

查看依賴

常用命令:

  • mvn dependency:list
  • mvn dependency:tree
  • mvn dependency:analyze

mvn dependency:list

該命令可以查看依賴。例如:

? aggregator git:(main) ? mvn dependency:list [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] Aggregator [pom] [INFO] module1 [jar] [INFO] module2 [jar] [INFO] [INFO] ------------------< com.example.demo0402:aggregator >------------------- [INFO] Building Aggregator 0.0.1-SNAPSHOT [1/3] [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.2.0:list (default-cli) @ aggregator --- [INFO] [INFO] The following files have been resolved: [INFO] none [INFO] [INFO] [INFO] --------------------< com.example.demo0402:module1 >-------------------- [INFO] Building module1 0.0.1-SNAPSHOT [2/3] [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.2.0:list (default-cli) @ module1 --- [INFO] [INFO] The following files have been resolved: [INFO] org.springframework.boot:spring-boot-starter-web:jar:2.6.6:compile -- module spring.boot.starter.web [auto] [INFO] org.springframework.boot:spring-boot-starter:jar:2.6.6:compile -- module spring.boot.starter [auto] [INFO] org.springframework.boot:spring-boot:jar:2.6.6:compile -- module spring.boot [auto] [INFO] org.springframework.boot:spring-boot-autoconfigure:jar:2.6.6:compile -- module spring.boot.autoconfigure [auto] [INFO] org.springframework.boot:spring-boot-starter-logging:jar:2.6.6:compile -- module spring.boot.starter.logging [auto] [INFO] ch.qos.logback:logback-classic:jar:1.2.11:compile -- module logback.classic (auto) [INFO] ch.qos.logback:logback-core:jar:1.2.11:compile -- module logback.core (auto) [INFO] org.apache.logging.log4j:log4j-to-slf4j:jar:2.17.2:compile -- module org.apache.logging.slf4j [auto] [INFO] org.apache.logging.log4j:log4j-api:jar:2.17.2:compile -- module org.apache.logging.log4j [INFO] org.slf4j:jul-to-slf4j:jar:1.7.36:compile -- module jul.to.slf4j (auto) [INFO] jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile -- module java.annotation [auto] [INFO] org.yaml:snakeyaml:jar:1.29:compile -- module org.yaml.snakeyaml [auto] [INFO] org.springframework.boot:spring-boot-starter-json:jar:2.6.6:compile -- module spring.boot.starter.json [auto] [INFO] com.fasterxml.jackson.core:jackson-databind:jar:2.13.2.2:compile -- module com.fasterxml.jackson.databind [INFO] com.fasterxml.jackson.core:jackson-annotations:jar:2.13.2:compile -- module com.fasterxml.jackson.annotation [INFO] com.fasterxml.jackson.core:jackson-core:jar:2.13.2:compile -- module com.fasterxml.jackson.core [INFO] com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.13.2:compile -- module com.fasterxml.jackson.datatype.jdk8 [INFO] com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.13.2:compile -- module com.fasterxml.jackson.datatype.jsr310 [INFO] com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.13.2:compile -- module com.fasterxml.jackson.module.paramnames [INFO] org.springframework.boot:spring-boot-starter-tomcat:jar:2.6.6:compile -- module spring.boot.starter.tomcat [auto] [INFO] org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.60:compile -- module org.apache.tomcat.embed.core [INFO] org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.60:compile -- module org.apache.tomcat.embed.el [INFO] org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.60:compile -- module org.apache.tomcat.embed.websocket [INFO] org.springframework:spring-web:jar:5.3.18:compile -- module spring.web [auto] [INFO] org.springframework:spring-beans:jar:5.3.18:compile -- module spring.beans [auto] [INFO] org.springframework:spring-webmvc:jar:5.3.18:compile -- module spring.webmvc [auto] [INFO] org.springframework:spring-aop:jar:5.3.18:compile -- module spring.aop [auto] [INFO] org.springframework:spring-context:jar:5.3.18:compile -- module spring.context [auto] [INFO] org.springframework:spring-expression:jar:5.3.18:compile -- module spring.expression [auto] [INFO] org.springframework.boot:spring-boot-starter-test:jar:2.6.6:test -- module spring.boot.starter.test [auto] [INFO] org.springframework.boot:spring-boot-test:jar:2.6.6:test -- module spring.boot.test [auto] [INFO] org.springframework.boot:spring-boot-test-autoconfigure:jar:2.6.6:test -- module spring.boot.test.autoconfigure [auto] [INFO] com.jayway.jsonpath:json-path:jar:2.6.0:test -- module json.path (auto) [INFO] net.minidev:json-smart:jar:2.4.8:test -- module json.smart (auto) [INFO] net.minidev:accessors-smart:jar:2.4.8:test -- module accessors.smart (auto) [INFO] org.ow2.asm:asm:jar:9.1:test -- module org.objectweb.asm [INFO] org.slf4j:slf4j-api:jar:1.7.36:compile -- module org.slf4j [auto] [INFO] jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3:test -- module java.xml.bind [INFO] jakarta.activation:jakarta.activation-api:jar:1.2.2:test -- module jakarta.activation [INFO] org.assertj:assertj-core:jar:3.21.0:test -- module org.assertj.core [INFO] org.hamcrest:hamcrest:jar:2.2:test -- module org.hamcrest [auto] [INFO] org.junit.jupiter:junit-jupiter:jar:5.8.2:test -- module org.junit.jupiter [INFO] org.junit.jupiter:junit-jupiter-api:jar:5.8.2:test -- module org.junit.jupiter.api [INFO] org.opentest4j:opentest4j:jar:1.2.0:test -- module org.opentest4j [INFO] org.junit.platform:junit-platform-commons:jar:1.8.2:test -- module org.junit.platform.commons [INFO] org.apiguardian:apiguardian-api:jar:1.1.2:test -- module org.apiguardian.api [INFO] org.junit.jupiter:junit-jupiter-params:jar:5.8.2:test -- module org.junit.jupiter.params [INFO] org.junit.jupiter:junit-jupiter-engine:jar:5.8.2:test -- module org.junit.jupiter.engine [INFO] org.junit.platform:junit-platform-engine:jar:1.8.2:test -- module org.junit.platform.engine [INFO] org.mockito:mockito-core:jar:4.0.0:test -- module org.mockito [auto] [INFO] net.bytebuddy:byte-buddy:jar:1.11.22:test -- module net.bytebuddy [INFO] net.bytebuddy:byte-buddy-agent:jar:1.11.22:test -- module net.bytebuddy.agent [INFO] org.objenesis:objenesis:jar:3.2:test -- module org.objenesis [auto] [INFO] org.mockito:mockito-junit-jupiter:jar:4.0.0:test -- module org.mockito.junit.jupiter [auto] [INFO] org.skyscreamer:jsonassert:jar:1.5.0:test -- module jsonassert (auto) [INFO] com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test -- module android.json (auto) [INFO] org.springframework:spring-core:jar:5.3.18:compile -- module spring.core [auto] [INFO] org.springframework:spring-jcl:jar:5.3.18:compile -- module spring.jcl [auto] [INFO] org.springframework:spring-test:jar:5.3.18:test -- module spring.test [auto] [INFO] org.xmlunit:xmlunit-core:jar:2.8.4:test -- module org.xmlunit [auto] [INFO] [INFO] [INFO] --------------------< com.example.demo0402:module2 >-------------------- [INFO] Building module2 0.0.1-SNAPSHOT [3/3] ............ [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for Aggregator 0.0.1-SNAPSHOT: [INFO] [INFO] Aggregator ......................................... SUCCESS [ 0.554 s] [INFO] module1 ............................................ SUCCESS [ 0.289 s] [INFO] module2 ............................................ SUCCESS [ 0.247 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.463 s [INFO] Finished at: 2022-04-05T09:44:06+08:00 [INFO] ------------------------------------------------------------------------

mvn dependency:tree

該命令以樹的形式顯示依賴。例如:

? aggregator git:(main) ? mvn dependency:tree [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] Aggregator [pom] [INFO] module1 [jar] [INFO] module2 [jar] [INFO] [INFO] ------------------< com.example.demo0402:aggregator >------------------- [INFO] Building Aggregator 0.0.1-SNAPSHOT [1/3] [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.2.0:tree (default-cli) @ aggregator --- [INFO] com.example.demo0402:aggregator:pom:0.0.1-SNAPSHOT [INFO] [INFO] --------------------< com.example.demo0402:module1 >-------------------- [INFO] Building module1 0.0.1-SNAPSHOT [2/3] [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.2.0:tree (default-cli) @ module1 --- [INFO] com.example.demo0402:module1:jar:0.0.1-SNAPSHOT [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.6.6:compile [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.6.6:compile [INFO] | | +- org.springframework.boot:spring-boot:jar:2.6.6:compile [INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.6.6:compile [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.6.6:compile [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.11:compile [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.2.11:compile [INFO] | | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.17.2:compile [INFO] | | | | \- org.apache.logging.log4j:log4j-api:jar:2.17.2:compile [INFO] | | | \- org.slf4j:jul-to-slf4j:jar:1.7.36:compile [INFO] | | +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile [INFO] | | \- org.yaml:snakeyaml:jar:1.29:compile [INFO] | +- org.springframework.boot:spring-boot-starter-json:jar:2.6.6:compile [INFO] | | +- com.fasterxml.jackson.core:jackson-databind:jar:2.13.2.2:compile [INFO] | | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.13.2:compile [INFO] | | | \- com.fasterxml.jackson.core:jackson-core:jar:2.13.2:compile [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.13.2:compile [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.13.2:compile [INFO] | | \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.13.2:compile [INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.6.6:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.60:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.60:compile [INFO] | | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.60:compile [INFO] | +- org.springframework:spring-web:jar:5.3.18:compile [INFO] | | \- org.springframework:spring-beans:jar:5.3.18:compile [INFO] | \- org.springframework:spring-webmvc:jar:5.3.18:compile [INFO] | +- org.springframework:spring-aop:jar:5.3.18:compile [INFO] | +- org.springframework:spring-context:jar:5.3.18:compile [INFO] | \- org.springframework:spring-expression:jar:5.3.18:compile [INFO] \- org.springframework.boot:spring-boot-starter-test:jar:2.6.6:test [INFO] +- org.springframework.boot:spring-boot-test:jar:2.6.6:test [INFO] +- org.springframework.boot:spring-boot-test-autoconfigure:jar:2.6.6:test [INFO] +- com.jayway.jsonpath:json-path:jar:2.6.0:test [INFO] | +- net.minidev:json-smart:jar:2.4.8:test [INFO] | | \- net.minidev:accessors-smart:jar:2.4.8:test [INFO] | | \- org.ow2.asm:asm:jar:9.1:test [INFO] | \- org.slf4j:slf4j-api:jar:1.7.36:compile [INFO] +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3:test [INFO] | \- jakarta.activation:jakarta.activation-api:jar:1.2.2:test [INFO] +- org.assertj:assertj-core:jar:3.21.0:test [INFO] +- org.hamcrest:hamcrest:jar:2.2:test [INFO] +- org.junit.jupiter:junit-jupiter:jar:5.8.2:test [INFO] | +- org.junit.jupiter:junit-jupiter-api:jar:5.8.2:test [INFO] | | +- org.opentest4j:opentest4j:jar:1.2.0:test [INFO] | | +- org.junit.platform:junit-platform-commons:jar:1.8.2:test [INFO] | | \- org.apiguardian:apiguardian-api:jar:1.1.2:test [INFO] | +- org.junit.jupiter:junit-jupiter-params:jar:5.8.2:test [INFO] | \- org.junit.jupiter:junit-jupiter-engine:jar:5.8.2:test [INFO] | \- org.junit.platform:junit-platform-engine:jar:1.8.2:test [INFO] +- org.mockito:mockito-core:jar:4.0.0:test [INFO] | +- net.bytebuddy:byte-buddy:jar:1.11.22:test [INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.11.22:test [INFO] | \- org.objenesis:objenesis:jar:3.2:test [INFO] +- org.mockito:mockito-junit-jupiter:jar:4.0.0:test [INFO] +- org.skyscreamer:jsonassert:jar:1.5.0:test [INFO] | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test [INFO] +- org.springframework:spring-core:jar:5.3.18:compile [INFO] | \- org.springframework:spring-jcl:jar:5.3.18:compile [INFO] +- org.springframework:spring-test:jar:5.3.18:test [INFO] \- org.xmlunit:xmlunit-core:jar:2.8.4:test [INFO] [INFO] --------------------< com.example.demo0402:module2 >-------------------- [INFO] Building module2 0.0.1-SNAPSHOT [3/3] [INFO] --------------------------------[ jar ]--------------------------------- ............ [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for Aggregator 0.0.1-SNAPSHOT: [INFO] [INFO] Aggregator ......................................... SUCCESS [ 0.569 s] [INFO] module1 ............................................ SUCCESS [ 0.111 s] [INFO] module2 ............................................ SUCCESS [ 0.024 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.098 s [INFO] Finished at: 2022-04-05T09:48:29+08:00 [INFO] ------------------------------------------------------------------------

mvn dependency:analyze

該命令用來分析依賴。例如:

? aggregator git:(main) ? mvn dependency:analyze [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] Aggregator [pom] [INFO] module1 [jar] [INFO] module2 [jar] [INFO] [INFO] ------------------< com.example.demo0402:aggregator >------------------- [INFO] Building Aggregator 0.0.1-SNAPSHOT [1/3] [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] >>> maven-dependency-plugin:3.2.0:analyze (default-cli) > test-compile @ aggregator >>> [INFO] [INFO] <<< maven-dependency-plugin:3.2.0:analyze (default-cli) < test-compile @ aggregator <<< [INFO] [INFO] [INFO] --- maven-dependency-plugin:3.2.0:analyze (default-cli) @ aggregator --- [INFO] Skipping pom project [INFO] [INFO] --------------------< com.example.demo0402:module1 >-------------------- [INFO] Building module1 0.0.1-SNAPSHOT [2/3] [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] >>> maven-dependency-plugin:3.2.0:analyze (default-cli) > test-compile @ module1 >>> [INFO] [INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ module1 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Using 'UTF-8' encoding to copy filtered properties files. [INFO] Copying 1 resource [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ module1 --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ module1 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Using 'UTF-8' encoding to copy filtered properties files. [INFO] skip non existing resourceDirectory /home/ding/Downloads/test0402/aggregator/module1/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ module1 --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] <<< maven-dependency-plugin:3.2.0:analyze (default-cli) < test-compile @ module1 <<< [INFO] [INFO] [INFO] --- maven-dependency-plugin:3.2.0:analyze (default-cli) @ module1 --- [WARNING] Used undeclared dependencies found: [WARNING] org.springframework.boot:spring-boot-autoconfigure:jar:2.6.6:compile [WARNING] org.springframework.boot:spring-boot:jar:2.6.6:compile [WARNING] org.junit.jupiter:junit-jupiter-api:jar:5.8.2:test [WARNING] org.springframework.boot:spring-boot-test:jar:2.6.6:test [WARNING] Unused declared dependencies found: [WARNING] org.springframework.boot:spring-boot-starter-web:jar:2.6.6:compile [WARNING] org.springframework.boot:spring-boot-starter-test:jar:2.6.6:test [INFO] [INFO] --------------------< com.example.demo0402:module2 >-------------------- [INFO] Building module2 0.0.1-SNAPSHOT [3/3] [INFO] --------------------------------[ jar ]--------------------------------- ............ [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for Aggregator 0.0.1-SNAPSHOT: [INFO] [INFO] Aggregator ......................................... SUCCESS [ 0.543 s] [INFO] module1 ............................................ SUCCESS [ 1.136 s] [INFO] module2 ............................................ SUCCESS [ 0.212 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.264 s [INFO] Finished at: 2022-04-05T09:49:03+08:00 [INFO] ------------------------------------------------------------------------

結果中有非常重要的兩部分:

  • Used undeclared dependencies :使用了但未聲明的依賴,比如模塊實際上依賴于A和B,而A本身也依賴于B,則只需聲明依賴A即可,B也會被隱式加入。但是這種做法顯然不好,以后如果A升級了,不依賴于B了,代碼就會報錯。
  • Unused declared dependencies :聲明了但未使用的依賴。比如本例中的 spring-boot-starter-web ,雖然聲明了該依賴,但在代碼中并沒有使用相關的功能,所以是多余的。但是對于此類依賴,也不要輕易刪除,一來可能是因為將來會用,二來分析結果只包含main和test所需要的依賴,一些其它的比如運行時依賴則沒考慮在內。總之要小心測試,謹慎刪除。

總結

以上是生活随笔為你收集整理的Maven的依赖(Dependency)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。