轉:[https://blog.csdn.net/u014297148/article/details/79935428](https://blog.csdn.net/u014297148/article/details/79935428)
## 1.依賴范圍
依賴包參與范圍:編譯、測試、打包、安裝、部署
想必大家在maven的pom.xml文件中 定義依賴 除了 groupId ,artifactId,version三個必要的標簽外,還見過 另外一個標簽scope(如下)。沒錯這個標簽就是我下面要說的依賴范圍。
```
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
```
其實maven中的依賴范圍有很多種,但是我們常用的只有以下三種,我們掌握這三種就夠用了。他們分別是 **compile (編譯)范圍**依賴,**test(測試)依賴**,**provided依賴**。那問題來了我們在定義依賴的時候 這個scope 該怎么填呢?我們先講一下判定規則:

1. 是否對main主程序有效(寫代碼時)
2. 是否對test測試程序有效(寫測試程序時)
3. 是否參與打包(package或install)
4. 是否參與部署(deploy)
其實可以把這三個依賴分為兩種情況
針對程序結構(分主程序和測試程序)的依賴
我們在前面就講過 maven project 遵循著一定目錄結構

**1.complie**
**complie 編譯范圍的依賴** (默認,典型例子 spring-core 對main和test都有效,參與打包參與部署)
```
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
```

**2.test**
**test 測試范圍的依賴** (典型例子junit 只對test有效,不參與打包參與部署)
```
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
```
**3.provided**
針對開發過程的依賴
provided 范圍的依賴(典型例子servlet-api 在開發過程中必須提供(添加tomcat運行時環境/添加maven依賴),打包過程中忽略,運行時有servlet容器提供)
參與編譯與測試,不參與打包與部署(打成jar包時,不包含此依賴),如@ConditionOnClass注解,編譯時可以通過
```
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>6.0.32</version>
</dependency>
```

## 2.依賴傳遞
為了證明依賴會傳遞我分別建了一個A模塊 依賴junit 和spring-core;B模塊依賴junit和A模塊如下:


我們用idea的依賴樹來看下 A模塊,B模塊這兩個模塊的依賴關系樹:
先是A模塊的 dependency tree

再是B模塊的關系樹 dependcy tree

從B的pom.xml 代碼中,我們可以看出 B模塊在pom.xml文件中并沒有直接的配置Spring-core的依賴,但是從B的依賴關系樹種我們可以看出B也依賴了spring-core,只是這個依賴關系是因為 A依賴了spring-core ,而B又依賴了A所以 B也間接的依賴了spring-core因此可以得出一個結論:
依賴可以相互之間傳遞
3.依賴排除
在某些情況下我們可能需要依賴某個a.jar,但又不想間接依賴這個a.jar所依賴的jar包,這時我們可以采用exclusion 來排除某個依賴。 如下:
```
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.6.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
```
4.依賴原則
我們在工作中的項目都是分模塊的,而且模塊之間又互相依賴,這個時候我們可能會引入相同的依賴 ,這時maven取那個依賴呢?這就是maven依賴的原則:
路徑不同間接依賴中maven采用的是路徑最短者優先
路徑相同間接依賴中maven 采用的是依賴定義順序從上到下
我們可以通過以下來驗證這兩個依賴原則的正確性,定義一個A模塊分別依賴junit 與spring-core-4.2.7; 定義一個B模塊 依賴與junit與A模塊 與spring-core-4.3.7;定義一個C模塊分別依賴junit與B;定義一個D模塊 分別依賴A模塊與C模塊。然后根據
C模塊與D模塊最后依賴的spring-core的版本來驗證上述兩個依賴原則。
A模塊

B模塊

C模塊

根據C模塊的依賴關系樹 如下

D模塊則分兩種情況:
1.B模塊先定義與
```
<dependencies>
<dependency>
<groupId>com.javxuam.maven</groupId>
<artifactId>B</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.javxuam.maven</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
```

A依賴定義優先B依賴
```
<dependencies>
<dependency>
<groupId>com.javxuam.maven</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.javxuam.maven</groupId>
<artifactId>B</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
```

- 計算機網絡
- 基礎_01
- tcp/ip
- http轉https
- Let's Encrypt免費ssl證書(基于haproxy負載)
- what's the http?
- 網關
- 網絡IO
- http
- 工具
- Git
- 初始本地倉庫并上傳
- git保存密碼
- Gitflow
- maven
- 1.生命周期命令
- 聚合與繼承
- 插件管理
- assembly
- 資源管理插件
- 依賴范圍
- 分環境打包
- dependencyManagement
- 版本分類
- 找不到主類
- 無法加載主類
- 私服
- svn
- gradle
- 手動引入第三方jar包
- 打包exe文件
- Windows
- java
- 設計模式
- 七大原則
- 1.開閉原則
- 2. 里式替換原則
- 3. 依賴倒置原則
- 4. 單一職責原則
- 單例模式
- 工廠模式
- 簡單工廠
- 工廠方法模式
- 抽象工廠模式
- 觀察者模式
- 適配器模式
- 建造者模式
- 代理模式
- 適配器模式
- 命令模式
- json
- jackson
- poi
- excel
- easy-poi
- 規則
- 模板
- 合并單元格
- word
- 讀取
- java基礎
- 類路徑與jar
- 訪問控制權限
- 類加載
- 注解
- 異常處理
- String不可變
- 跨域
- transient關鍵字
- 二進制編碼
- 泛型1
- 與或非
- final詳解
- Java -jar
- 正則
- 讀取jar
- map
- map計算
- hashcode計算原理
- 枚舉
- 序列化
- URLClassLoader
- 環境變量和系統變量
- java高級
- java8
- 1.Lambda表達式和函數式接口
- 2.接口的默認方法和靜態方法
- 3.方法引用
- 4.重復注解
- 5.類型推斷
- 6.拓寬注解的應用場景
- java7-自動關閉資源機制
- 泛型
- stream
- 時區的正確理解
- StringJoiner字符串拼接
- 注解
- @RequestParam和@RequestBody的區別
- 多線程
- 概念
- 線程實現方法
- 守護線程
- 線程阻塞
- 筆試題
- 類加載
- FutureTask和Future
- 線程池
- 同步與異步
- 高效簡潔的代碼
- IO
- ThreadLocal
- IO
- NIO
- 圖片操作
- KeyTool生成證書
- 壓縮圖片
- restful
- 分布式session
- app保持session
- ClassLoader.getResources 能搜索到的資源路徑
- java開發規范
- jvm
- 高并發
- netty
- 多線程與多路復用
- 異步與事件驅動
- 五種IO模型
- copy on write
- code style
- 布隆過濾器
- 筆試
- 數據庫
- mybatis
- mybatis與springboot整合配置
- pagehelper
- 分頁數據重復問題
- Java與數據庫之間映射
- 攔截器
- 攔截器應用
- jvm
- 堆內存測試
- 線程棧
- 直接內存
- 內存結構
- 內存模型
- 垃圾回收
- 調優
- 符號引用
- 運行參數
- 方法區
- 分帶回收理論
- 快捷開發
- idea插件
- 注釋模板
- git
- pull沖突
- push沖突
- Excel處理
- 圖片處理
- 合并單元格
- easypoi
- 模板處理
- 響應式編程
- reactor
- reactor基礎
- jingyan
- 規范
- 數據庫