亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot中怎么實現依賴管理

發布時間:2021-08-03 15:36:10 來源:億速云 閱讀:161 作者:Leah 欄目:編程語言

SpringBoot中怎么實現依賴管理,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1. 簡介

最近在處理一個SpringBoot多模塊項目的時候遇到一個問題,一個pom中只能有一個parent。

使用SpringBoot把SpringBoot設置為parent之后,項目本身就不能做為父項目添加子模塊module了。

怎么處理?使用dependencyManagement。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

dependencyManagement為什么有效?

在SpringBoot中我們經常使用依賴不帶版本為什么也可以?

2. dependencyManagement

dependencyManagement其實主要不是為了解決繼承問題,而是為了解決依賴版本混亂問題。

dependencyManagement主要用于多模塊項目的父項目中。

它的原理是:

當maven發現dependencies中的某個dependency沒有設置版本號version,它就會從它的父項目開始,在它的祖先項目中查找dependencyManagement中配置的dependency,直到找到一個有版本號version的依賴,使用該version。

從名字也可以看出dependencyManagement不是為了定義依賴,而是為了管理可能的依賴。有點繞,說個結論,就是如果在子模塊中沒有使用dependencyManagement定義的依賴,這些依賴的jar包就最終不會被打在輸出的jar包中。

3. 為什么使用SpringBoot很多依賴可以不用配置版本號

如果你看SpringBoot的pom就會發現它的父項目是:

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

spring-boot-dependencies中基本啥都沒干,就定義了默認的依賴和版本了。

spring-boot-dependencies的pom大致就像下面這個樣子的:

SpringBoot中怎么實現依賴管理

有興趣的朋友可以看一下這個pom中定義了哪些依賴,及其使用的版本。

4. 依賴管理

像SpringBoot一樣,我們在多模塊項目中也可以這樣玩,首先找出多個模塊的共同依賴,然后把他上移到父模塊的dependencyManagement,像這樣:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

依賴上移之后,子模塊的pom中要移除這些依賴,否則會覆蓋定義在父項目中的dependencyManagement中的依賴。

dependencyManagement中的dependencies下的依賴不能直接被子模塊繼承,必須顯式申明。直接在dependencies下的依賴可以被子項目繼承。

# 分析哪些依賴使用了但是沒有顯式定義,哪些依賴定義了沒有使用
mvn dependency:analyze

# 分析依賴層級關系
mvn dependency:tree

# 查看有效依賴
mvn help:effective-pom

5. scope

5.1 compile

默認的依賴范圍就是compile,沒有scope或者scope為comile的依賴表示編譯、運行、測試的時候都需要這個依賴的jar包。

5.2 provided

表示環境已經提供了,所以打包的時候就不會將scope為provided的依賴打到輸出的jar包中。

最典型的例子是servlet-api,因為這個依賴已經包含在像Tomcat這樣的Servlet服務器中了,所以打包的時候就不需要將這個依賴再打包到輸出jar包中了。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

5.3 runtime

如果一個依賴的scope為runtime,表示編譯的時候不能引用這個依賴的jar包。

還有編譯的時候不需要運行的時候需要的jar包?

SPI相關的都是。主要是讓面向接口變成,而不要直接去使用實現類,如使用java.sql.Driver,而不是com.mysql.cj.jdbc.Driver。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
    <scope>runtime</scope>
</dependency>

5.4 test

scope為test的依賴表示,這個包只是在測試階段使用,打包的時候這些依賴不會打在輸出的jar包中。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>

5.5 system

system主要是為了引入一些沒有通過maven發布的私有的三方jar包。

這些jar包的特點是:

  1. 沒有發布,所以不能通過maven中央倉庫找到

  2. 是第三方的,所以不能使用自己的私服引入

  3. 只有jar包

當然你可以把這些jar包加在classpath中,但是對于maven項目來說不好管理。

這個時候,就可以使用scope為system的依賴了,只需要指定這些jar包在系統中的路徑就可以了。

<dependency>
    <groupId>vip.mycollege</groupId>
    <artifactId>tools</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>F:/lib/tools.jar</systemPath>
</dependency>

5.6 import

import只能在dependencyManagement的dependency,并且type為pom的依賴中使用。

import主要是為了將依賴管理和依賴定義分開。

例如SpringBoot的dependencyManagement中預定義很多依賴,所以就單獨弄了一個spring-boot-dependencies來管理這些依賴。

6. optional

optional是用于控制依賴傳遞的。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

optional設置為true,這個依賴不會被傳遞,加入在A項目中添加了這個依賴,B項目依賴A,但是B項目不會依賴spring-boot-devtools。

看完上述內容,你們掌握SpringBoot中怎么實現依賴管理的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长治县| 临颍县| 茂名市| 黄冈市| 仁布县| 马龙县| 来安县| 桓台县| 新营市| 东乌珠穆沁旗| 新龙县| 江陵县| 阜阳市| 石河子市| 旺苍县| 韶山市| 吉木萨尔县| 墨江| 马公市| 新余市| 册亨县| 龙陵县| 滦平县| 贵南县| 荥经县| 城步| 丘北县| 贞丰县| 蕲春县| 凌源市| 唐海县| 肃北| 渑池县| 洞头县| 行唐县| 临湘市| 桦甸市| 武宣县| 资中县| 安达市| 东明县|