iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Software Development

我們與Maven的距離系列 第 15

Day14 - Dependency Management

  • 分享至 

  • xImage
  •  

前言

有了前一天的依賴傳遞相關知識後,你可能會希望當使用的套件相依路徑相同時採用較低的版本讓系統比較沒有問題;又或者是希望可以排除某些依賴不要加進專案中,今天就讓我們來看看有哪些相依處理的作法

依賴管理

版本管理

前一天我們遇到路徑相同但因聲明順序不同而造成版本變動的問題,這時我們可以透過<dependencyManagement>針對套件指定版本,這樣我們就可以避免這個問題,我們以前一日spring與beanUtil套件進行演示
https://ithelp.ithome.com.tw/upload/images/20250929/20128084dCra7An4T5.png
我們試著修改common-logging版本為1.3.5

<dependencyManagement>
  <dependencies>
    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.3.5</version>
    </dependency>
  </dependencies>
</dependencyManagement>

執行dependency:tree -Dverbose,就會看到版本變成我們設定的1.3.5
https://ithelp.ithome.com.tw/upload/images/20250929/20128084gh7YHWa3KO.png

依賴衝突處理

前面的例子我們可能會因為有套件版本比較高所以使用較新版本套件(因為Java通常向下相容),我們也可以透過<exclusions>排除低版本來完成我們的目的,當然也有可能發生依賴衝突(因為高版本的套件移除舊版本API,導致低版本套件發生Exception),下面列示如何使用

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.6</version>
    <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
  </dependency>
<dependency>

https://ithelp.ithome.com.tw/upload/images/20250929/20128084uD0HmuGhI1.png

依賴優化

  1. 先透過mvn dependency:tree -verbose確認哪些套件因為依賴原則被引用到低版本或高版本,經過團隊考量可以透過dependencyManagement指定套件版本

  2. 可以透過dependency:analyze指令分析出

    • 使用的並且聲明的依賴(Used declared dependencies)
    • 使用的但是未聲明的依賴(Used undeclared dependencies)
    • 未使用的但是聲明的依賴(Unused declared dependencies)
      未使用的但是聲明的依賴我們是否可以直接刪除呢,要注意的是這邊的未使用是指我們src/資料夾的程式碼未引用到,但有可能是相關套件有使用到,故要刪除套件的時後務必確認。

情境題1.你同事走到你的身邊說道,資訊部門要回報是否有用到XXX套件,XXX套件有License issue,

此時可以使用mvn dependency:list指令,它會把你專案所使用到的套件列示出來,查詢完就可以秒回囉!!

情境題2.聽說Spring Boot預設使用的logging效能沒有比log4j要好,你可幫我換一下嗎

我們查看Spring Boot官網有寫到透過exclusionsspring-boot-starter-logging移除再引入spring-boot-starter-log4j2就可以完成,這邊很簡單的我們可以透過exclusions幫我們達成

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

小結

本日我們說明了依賴管理的做法,並有三個好用的指令(dependency:treedependency:analyzedependency:list)幫助我們事半功倍

Reference


上一篇
Day13 - Transitive Dependencies
下一篇
Day 15 - Project Inheritance
系列文
我們與Maven的距離16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言