您好,登錄后才能下訂單哦!
SpringBoot中怎么實現依賴管理,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
最近在處理一個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中我們經常使用依賴不帶版本為什么也可以?
dependencyManagement其實主要不是為了解決繼承問題,而是為了解決依賴版本混亂問題。
dependencyManagement主要用于多模塊項目的父項目中。
它的原理是:
當maven發現dependencies中的某個dependency沒有設置版本號version,它就會從它的父項目開始,在它的祖先項目中查找dependencyManagement中配置的dependency,直到找到一個有版本號version的依賴,使用該version。
從名字也可以看出dependencyManagement不是為了定義依賴,而是為了管理可能的依賴。有點繞,說個結論,就是如果在子模塊中沒有使用dependencyManagement定義的依賴,這些依賴的jar包就最終不會被打在輸出的jar包中。
如果你看SpringBoot的pom就會發現它的父項目是:
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId>
spring-boot-dependencies中基本啥都沒干,就定義了默認的依賴和版本了。
spring-boot-dependencies的pom大致就像下面這個樣子的:
有興趣的朋友可以看一下這個pom中定義了哪些依賴,及其使用的版本。
像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
默認的依賴范圍就是compile,沒有scope或者scope為comile的依賴表示編譯、運行、測試的時候都需要這個依賴的jar包。
表示環境已經提供了,所以打包的時候就不會將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>
如果一個依賴的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>
scope為test的依賴表示,這個包只是在測試階段使用,打包的時候這些依賴不會打在輸出的jar包中。
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency>
system主要是為了引入一些沒有通過maven發布的私有的三方jar包。
這些jar包的特點是:
沒有發布,所以不能通過maven中央倉庫找到
是第三方的,所以不能使用自己的私服引入
只有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>
import只能在dependencyManagement的dependency,并且type為pom的依賴中使用。
import主要是為了將依賴管理和依賴定義分開。
例如SpringBoot的dependencyManagement中預定義很多依賴,所以就單獨弄了一個spring-boot-dependencies來管理這些依賴。
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中怎么實現依賴管理的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。