天天看點

Maven之——坐标和依賴(上) Maven之——坐标和依賴(上)

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倉庫之外的類庫檔案