前言
最近參與了一個項目,使用maven管理依賴.項目拆分了很多模塊.然后交個多個團隊各自開發.最后在一個項目骨架中,把各自的模塊引入進來,一起啟動.
后來隨著項目的深入.引入的jar包變多.發現
jar包太多,編譯太慢,
打包之后的war包非常大.
這種情況就可以使用optional來優化
什么是optional
optional是maven依賴jar時的一個選項,表示該依賴是可選的.不會被依賴傳遞
<optional>true</optional>
使用場景
以項目中使用到的日志框架為例.
例如
B 依賴了日志框架 logback
、log4j
、apache commons log
這時候的依賴關系如下 A-> B (A依賴B)
因為maven有依賴傳遞機制.那么A項目就會有3個jar包,logback
、log4j
、apache commons log
.實際上我們一般只會在項目中使用一種日志框架.那么我們項目中就會有多余的依賴.當這種情況時越來越多時,最后整個項目的jar包就有很多的多余依賴,導致項目很臃腫.
如何優化
只要B項目中把logback、log4j
、apache commons log
設置成<optional>true</optional>
例如
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><optional>true</optional>
</dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><optional>true</optional>
</dependency>
這時候A項目依賴B的時候,項目中不會有logback
、log4j
、apache commons log
jar包,可以根據情況自行選擇一個即可.
總結
當你開發的組件時,有一個功能,有多種實現方式的jar可以提供,但是實際只會使用一種的情況下.可以把實現的jar包設置成<optional>true</optional>
.表示: 瞧,你依賴我時,用到這個功能時,可以自行選擇.而不是默認全部都給你.管你用不用.
為什么要使用optional
減少不必要的依賴傳遞
減少jar包沖突
原理
引入了optional實際上默認會做排除操作
It may be helpful to think of optional dependencies as "excluded by default
參考資料
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html