Maven之——坐标和依賴(上)
1、 Maven坐标概念
Maven通過構件的坐标來在Maven倉庫中定位到具體的構件、Maven的坐标元素包括groupId、artifactId、versiion、packaging、classifier。Maven内置了一個中央倉庫位址、需要時Maven會根據坐标到其中下載下傳。具體關于中央倉庫的介紹在後面。
2、 Maven坐标詳解
比如下面一組坐标:
<groupId>org.andy.items</groupId>
<artifactId>scattered-items</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
groupId:定義目前Maven項目隸屬的實際項目。
artifactId:定義實際項目中的一個Maven項目(子產品)
version:定義Maven項目目前所出的版本。
packaging:定義Maven項目的打包方式、打包方式通常與生成構件的檔案擴充名對應、例如上面最終生産的檔案名為:scattered-items-1.0-SNAPSHOT.jar。而使用war打包方式的Maven項目最終生成的構件會有一個.war檔案、其次打包方式會影響到建構的生命周期、當不定義packaging的時候、Maven會使用預設值jar。
classifier:用來幫助定義建構輸出的一些附屬構件、不能直接定義項目的classifier、因為附屬構件不是項目直接預設生成的、而是由附加的插件幫助生成。
上述5個元素中、groupId、artifactId、version、是必須的、packaging是可選的、classifier是不能直接定義的。
3、 依賴配置
一個依賴可以包含的元素(項目中的pom.xml檔案):
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<scope></scope>
<type></type>
<optional></optional>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
跟元素project下的dependencies可以包含一個或者多個dependency元素、以聲明一個或者多個項目依賴、每個依賴可以包含的元素有:
groupId、artifactId、verion:必須元素、基本坐标。
type:依賴的類型、對應與項目坐标的packaging、大部分情況下該元素不必配置、其預設值是jar。
scope:依賴的範圍、
optional:标記依賴是否可選、
exclusions:用來排除傳遞性依賴。
這些都會在後面有詳細說明。
4、 依賴範圍
Maven在編譯、測試、運作項目時會使用不同的classpath、依賴範圍就是用來控制依賴與這三種classpath(編譯classpath、測試classpath、運作classpath)的關系的、
compile:編譯依賴範圍。如果沒有指定就會預設使用該依賴範圍。使用此編譯範圍的Maven依賴、對于編譯、測試、運作三種classpath都有效。
test:測試依賴範圍、隻對測試classpath有效。比如Junit、隻有在編譯和測試的時候才需要。
provided:已提供依賴範圍、對于編譯和測試有效、但是在運作時無效、如servlet.api。編譯和測試項目的時候需要、但是在運作的時候、servlet容器已經提供、就不需要Maven重複提供。
runtime:運作時依賴、對于測試和運作classpath有效、但是在編譯主代碼是無效、如JDBC驅動的實作、項目主代碼的編譯隻需要JDK提供的JDBC接口、隻有在執行測試或者運作項目的時候才需要上述接口的具體JDBC驅動。
system:系統依賴範圍。其與provided依賴範圍完全一緻。但使用時必須通過systemPath元素顯示第指定依賴檔案的路徑、謹慎使用。
import:導入依賴範圍、不會對三種classpath産生實際的影響、他是與dependencyManagement結合使用的。
例如下面一段配置:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.2.RELEASE</version>
<scope>runtime</scope>
</dependency>
那麼你在主代碼目錄下想使用Springframework的jar包中的任何類都是找不到的、編譯器提示錯誤。
public class FooServiceImpl implements FoodService {
private ApplicationContext context;
private String str;
@Override
會提示找不到ApplicationContext類。這依賴範圍<scope>xxx</scope>在使用的時候一定要注意!
依賴範圍 | 編譯classpath | 測試classpath | 運作classpath | 示例 |
compile | Y | Y | Y | spring-core |
test | Y | Y | junit | |
provided | Y | Y | servlet-api | |
runtime | Y | Y | JDBC驅動 | |
system | Y | Y | 本地的、Maven倉庫之外的類庫檔案 |