《Maven權威指南》學習筆記(二)

《Maven權威指南》學習筆記(二)

  1. POM
    1. POM是Maven中一個項目的描述性陳述;也是當Maven構建項目的時候需要理解的一份“地圖”
    2. 我們已經確定了POM是描述性和聲明性的,它不像Ant或者Make那樣提供顯式的指令,我們也注意到POM的概念不是特定於Java的
    3. 超級POM:它是Maven安裝的一部分,可以在/usr/local/maven/lib中的maven-2.0.9-uber.jar文件中找到。如果你看一下這個JAR文件,你會看到在包org.apache.maven.project下看到一個名爲pom-4.0.0.xml的文件
      1. 默認的超級POM定義了一個單獨的遠程Maven倉庫,該配置可以通過一個自定義的settings.xml文件來覆蓋.注意這個默認的超級POM關閉了從中央Maven倉庫下載snapshot構件的功能
      2. 默認的插件倉庫就是這個中央倉庫。Snapshot被關閉了,而且更新策略被設置成了“從不”,這意味着Maven將永遠不會自動更新一個插件,即使新版本的插件發佈了。
      3. build元素設置Maven標準目錄佈局中那些目錄的默認值
      4. 從Maven 2.0.9開始,超級POM爲核心插件提供了默認版本
      5. 所有的Maven POM都繼承自超級POM
    4. Maven開始於超級POM,然後使用一個或多個父POM覆蓋默認配置,最後使用當前項目的POM來覆蓋之前生成的配置結果。最後你得到了一個混合了各個POM配置的有效POM。如果你想要查看項目的有效POM,你需要運行Maven Help插件的effective-pom目標
    5. 項目版本
      1. Maven中的版本包含了以下部分:主版本,次版本,增量版本,和限定版本號
      2. 限定版本用來標識里程碑構建:alpha和beta發佈,限定版本通過連字符與主版本,次版本或增量版本隔離
      3. 如果你的版本號與格式<主版本>.<次版本>.<增量版本>-<限定版本>相匹配,它就能被正確的比較,這種比較基於主版本,次版本,和增量版本的數值,如果不標準,就會使用字符串進行比較.
      4. Maven會將限定版本後面的數字認作一個構建版本.但構建版本的解析還是使用字符串進行比較.可以使用“alpha-02”和“alpha-10”來解決
      5. 如果一個版本包含字符串“SNAPSHOT”,Maven就會在安裝或發佈這個組件的時候將該符號展開爲一個日期和時間值,轉換爲UTC(協調世界時)(沒試過)
      6. LATEST是指某個特定構件最新的發佈版或者快照版(snapshot),最近被部署到某個特定倉庫的構件。RELEASE是指倉庫中最後的一個非快照版本.如果你處於軟件開發過程中,你可能想要使用RELEASE或者LATEST,這麼做十分方便,你也不用爲每次一個第三方類庫新版本的發佈而去更新你配置的版本號。但當你發佈軟件的時候,你總是應該確定你的項目依賴於某個特定的版本
    6. 屬性引用
      1. 一個POM可以通過一對大括弧和前面一個美元符號來包含 對屬性的引用
      2. Maven提供了三個隱式的變量,可以用來訪問環境變量,POM信息,和Maven Settings
        1. env:env.*   環境變量如PATH和M2_HOME可以使用env.*前綴來引用
        2. project:你可以使用點標記(.)的路徑來引用POM元素的值,如${project.artifactId}
        3. settings:例如,${settings.offline}會引用~/.m2/settings.xml文件中offline元素的值
      3. 你還可以引用系統屬性,以及任何在Maven POM中和構建profile中自定義的屬性組
        1. Java系統屬性:所有可以通過java.lang.System中getProperties()方法訪問的屬性都被暴露成POM屬性
        2. 我們還可以通過pom.xml或者settings.xml中的properties元素設置自己的屬性,或者還可以使用外部載入的文件中屬性
    7. 項目依賴
      1. 依賴範圍
        1. compile(編譯範圍).compile是默認的範圍;如果沒有提供一個範圍,那該依賴的範圍就是編譯範圍。編譯範圍依賴在所有的classpath中可用,同時它們也會被打包
        2. provided(已提供範圍).當你的開發過程只有在編譯和測試時需要一個類庫,而該類庫在運行的時候由容器提供,那麼你就需要使用已提供範圍的依賴.已提供範圍的依賴在編譯classpath(不是運行時)可用。它們不是傳遞性的,也不會被打包。
        3. runtime(運行時範圍).runtime依賴在運行和測試系統的時候需要,但在編譯的時候不需要
        4. test(測試範圍).在一般的 編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用
        5. system(系統範圍)system範圍依賴與provided類似,但是你必須顯式的提供一個對於本地系統中JAR文件的路徑
      2. 可選依賴(使用不多,不推薦)
      3. 依賴版本界限
        1. (, )不包含量詞
        2. [, ]包含量詞
        3. 在逗號前面或者後面的版本不是必須的,這種空缺意味着正無窮或者負無窮
      4. 傳遞性依賴:其中的”傳遞性依賴和範圍”有點繞,待實際需要了解時再做進一步瞭解.
      5. 衝突解決
        1. 排除一個傳遞性依賴
        2. 排除並替換一個傳遞性依賴
      6. 依賴管理
        1. Maven在dependencyManagement元素中爲你提供了一種方式來統一依賴版本號,使用pom.xml中的dependencyManagement元素能讓你在子項目中引用一個依賴而不用顯式的列出版本號
        2. 如果子項目定義了一個版本,它將覆蓋頂層POM的dependencyManagement元素中的版本
        3. 頂層POM中的依賴管理與在一個廣泛共享的父POM中定義一個依賴是不同的:所有依賴都會被繼承。如果mysql-connector-java在頂層父項目中被作爲一個依賴列出,這個層次中的所有項目都將引用該依賴。爲了不添加一些不必要的依賴,使用dependencyManagement能讓你統一併集中化依賴版本的管理,而不用添加那些會被所有子項目繼承的依賴
      7. 項目關係
        1. 你應該避免在artifactId中使用它。因爲在解析一個完整限定名字至子模塊的時候,這會引發問題
        2. 座標:groupId,artifactId,和version.還有第四個,也是最少用到的限定符:classifier
        3. 多模塊項目:
          1. 多模塊項目是那些包含一系列待構建模塊的項目。一個多模塊項目的打包類型總是pom,很少生成一個構件。一個模塊項目的存在只是爲了將很多項目歸類在一起,成爲一個構建
        4. 項目繼承:
          1. Maven假設父POM在本地倉庫中可用,或者在當前項目的父目錄(../pom.xml) 中可用。如果兩個位置都不可用,默認行爲還可以通過relativePath元素被覆蓋
        5. POM最佳實踐
          1. 依賴歸類:如果你有一組邏輯上歸類在一起的依賴。你可以創建一個打包方式爲pom項目來將這些依賴歸在一起.當你添加這個項目作爲一個依賴,不要忘了指定依賴類型爲pom(<type>pom</type>)
          2. 多模塊 vs. 繼承.多模塊構建用來將模塊聚集到一個單獨的構建中,父子關係更多的是處理一個特定項目的定義.介紹了兩個例子,它們都綜合運用了多模塊和繼承,這兩個例子的思想各有不同,要好好研究.

原創文章,轉載請註明: 轉載自Ryan's note

發佈了171 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章