鮮為人知的maven標籤解說

  • 2019 年 10 月 3 日
  • 筆記

maven是一個項目構建和管理的工具,提供了幫助管理 構建、文檔、報告、依賴、scms、發布、分發的方法。可以方便的編譯程式碼、進行依賴管理、管理二進位庫等等。
maven的好處在於可以將項目過程規範化、自動化、高效化以及強大的可擴展性
利用maven自身及其插件還可以獲得程式碼檢查報告、單元測試覆蓋率、實現持續集成等等。

localRepository

用於指定存儲jar包的路徑,換句話說就是本地倉庫地址,如果不設置默認是${user.home}/.m2/repository 。${user.home}是系統環境變數

<localRepository>E:/.m2</localRepository>

interactiveMode

表示是否使用交互模式,默認是true;如果設為false,那麼當Maven需要用戶進行輸入的時候,它會使用一個默認值。

<interactiveMode>true</interactiveMode>

offline

表示Maven是否需要在離線模式下運行。如果構建系統需要在離線模式下運行,則為true,默認為false。當由於網路設置原因或者安全因素,構建伺服器不能連接遠程倉庫的時候,我們就可以設置成false,這樣安全

<offline>false</offline>

pluginGroups

  • 元素里包含了一個pluginGroup列表。默認maven中有org.apache.maven.plugins和org.codehaus.mojo兩個pluginGroup。表示當通過plugin的前綴來解析plugin的時候到哪裡尋找。pluginGroup元素指定的是plugin的groupId
  • 如下使我們在pom文件中配置的一個插件,我們配置的坐標中並沒有指定groupId,熟悉maven的都知道我們引入以來至少需要groupId和artifactId的。但是下面的插件中沒有。這個時候maven就會獲取pluginGroups里pluginGroup列表和配置中artifactId進行一一匹配。匹配到下載。這裡如果出現重複也沒關係,我們使用的時候使用對了就行了。
<plugins>            <plugin>                <artifactId>maven-compiler-plugin</artifactId>                <configuration>                    <source>1.7</source>                    <target>1.7</target>                </configuration>            </plugin>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>

proxies

其下面可以定義一系列的proxy子元素,表示Maven在進行聯網時需要使用到的代理。當設置了多個代理的時候第一個標記active為true的代理將會被使用

<proxies>    <!--代理元素包含配置代理時需要的資訊-->    <proxy>     <!--代理的唯一定義符,用來區分不同的代理元素。-->     <id>myproxy</id>     <!--該代理是否是激活的那個。true則激活代理。當我們聲明了一組代理,而某個時候只需要激活一個代理的時候,該元素就可以派上用處。 -->     <active>true</active>     <!--代理的協議。 協議://主機名:埠,分隔成離散的元素以方便配置。-->     <protocol>http</protocol>     <!--代理的主機名。協議://主機名:埠,分隔成離散的元素以方便配置。  -->     <host>proxy.somewhere.com</host>     <!--代理的埠。協議://主機名:埠,分隔成離散的元素以方便配置。 -->     <port>8080</port>     <!--代理的用戶名,用戶名和密碼錶示代理伺服器認證的登錄名和密碼。 -->     <username>proxyuser</username>     <!--代理的密碼,用戶名和密碼錶示代理伺服器認證的登錄名和密碼。 -->     <password>somepassword</password>     <!--不該被代理的主機名列表。該列表的分隔符由代理伺服器指定;例子中使用了豎線分隔符,使用逗號分隔也很常見。-->     <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>    </proxy>   </proxies>

servers

  • 配置服務端的一些設置。一些設置如安全證書不應該和pom.xml一起分發。這種類型的資訊應該存在於構建伺服器上的settings.xml文件中
<servers>  <!--伺服器元素包含配置伺服器時需要的資訊 -->  <server>   <!--這是server的id(注意不是用戶登陸的id),該id與distributionManagement中repository元素的id相匹配。-->   <id>server001</id>   <!--鑒權用戶名。鑒權用戶名和鑒權密碼錶示伺服器認證所需要的登錄名和密碼。 -->   <username>my_login</username>   <!--鑒權密碼 。鑒權用戶名和鑒權密碼錶示伺服器認證所需要的登錄名和密碼。密碼加密功能已被添加到2.1.0 +。詳情請訪問密碼加密頁面-->   <password>my_password</password>   <!--鑒權時使用的私鑰位置。和前兩個元素類似,私鑰位置和私鑰密碼指定了一個私鑰的路徑(默認是${user.home}/.ssh/id_dsa)以及如果需要的話,一個密語。將來passphrase和password元素可能會被提取到外部,但目前它們必須在settings.xml文件以純文本的形式聲明。 -->   <privateKey>${usr.home}/.ssh/id_dsa</privateKey>   <!--鑒權時使用的私鑰密碼。-->   <passphrase>some_passphrase</passphrase>   <!--文件被創建時的許可權。如果在部署的時候會創建一個倉庫文件或者目錄,這時候就可以使用許可權(permission)。這兩個元素合法的值是一個三位數字,其對應了unix文件系統的許可權,如664,或者775。 -->   <filePermissions>664</filePermissions>   <!--目錄被創建時的許可權。 -->   <directoryPermissions>775</directoryPermissions>  </server>  </servers>

## 使用方法

  • 我們在項目的pom中配置了發布屬性 distributionManagement是部署到遠程的配置標籤。這個標籤將在maven的pom章節講
<distributionManagement>    <repository>        <id>release-repository</id>        <name>Release Repository</name>        <url>http://www.myrepository.com/repositories/releases</url>    </repository>    <snapshotRepository>        <id>snapshot-repository</id>        <name>Snapshot Repository</name>        <url>http://www.myrepository.com/repositories/snapshots</url>    </snapshotRepository>  </distributionManagement>
  • 上面配置了SNAPSHOT包的上傳路徑和RELEASE包的上傳遠程地址,但是我們的這個遠程地址有許可權,最基本的就是需要帳號和密碼。這個時候我們不能暴露在項目中,我們就可以在maven的setting中設置了,就是通過servers標籤實現,

    <servers>      <server>          <id>snapshot-repository</id>          <username>snapshot</username>          <password>123456</password>      </server>      <server>          <id>release-repository</id>          <username>release</username>          <password>123456</password>      </server>  </servers>
  • 注意一點兩邊的id必須匹配才可以。 maven對密碼進行加密處理

mirrors

  • 為倉庫列表配置的下載鏡像列表。高級設置請參閱鏡像設置頁面,用於定義一系列的遠程倉庫的鏡像。我們可以在pom中定義一個下載工件的時候所使用的遠程倉庫。但是有時候這個遠程倉庫會比較忙,所以這個時候人們就想著給它創建鏡像以緩解遠程倉庫的壓力,也就是說會把對遠程倉庫的請求轉換到對其鏡像地址的請求。每個遠程倉庫都會有一個id,這樣我們就可以創建自己的mirror來關聯到該倉庫,那麼以後需要從遠程倉庫下載工件的時候Maven就可以從我們定義好的mirror站點來下載,這可以很好的緩解我們遠程倉庫的壓力。在我們定義的mirror中每個遠程倉庫都只能有一個mirror與它關聯,也就是說你不能同時配置多個mirror的mirrorOf指向同一個repositoryId。
    • id:是用來區別mirror的,所有的mirror不能有相同的id

    • mirrorOf:用來表示該mirror是關聯的哪一個倉庫,其值為其關聯倉庫的id。當要同時關聯多個倉庫時,這多個倉庫之間可以用逗號隔開;當要關聯所有的倉庫時,可以使用「」表示;當要關聯除某一個倉庫以外的其他所有倉庫時,可以表示為「,!repositoryId」;當要關聯不是localhost或用file請求的倉庫時,可以表示為「external:*」。

    • url:表示該鏡像的url。當Maven在建立系統的時候就會使用這個url來連接到我們的遠程倉庫。

 <mirrors>    <!--給定倉庫的下載鏡像。 -->    <mirror>     <!--該鏡像的唯一標識符。id用來區分不同的mirror元素。 -->     <id>planetmirror.com</id>     <!--鏡像名稱 -->     <name>PlanetMirror Australia</name>     <!--該鏡像的URL。構建系統會優先考慮使用該URL,而非使用默認的伺服器URL。 -->     <url>http://downloads.planetmirror.com/pub/maven2</url>     <!--被鏡像的伺服器的id。例如,如果我們要設置了一個Maven中央倉庫(http://repo.maven.apache.org/maven2/)的鏡像,就需要將該元素設置成central。這必須和中央倉庫的id central完全一致。-->     <mirrorOf>central</mirrorOf>    </mirror>   </mirrors>

profiles

  • 用於指定一系列的profile。profile元素由activation、repositories、pluginRepositories和properties四個元素組成。當一個profile在settings.xml中是處於活動狀態並且在pom.xml中定義了一個相同id的profile時,settings.xml中的profile會覆蓋pom.xml中的profile。

使用場景

  • profile可以讓我們定義一系列的配置資訊,然後指定其激活條件。這樣我們就可以定義多個profile,然後每個profile對應不同的激活條件和配置資訊,從而達到不同環境使用不同配置資訊的效果。比如說,我們可以通過profile定義在jdk1.5以上使用一套配置資訊,在jdk1.5以下使用另外一套配置資訊;或者有時候我們可以通過作業系統的不同來使用不同的配置資訊,比如windows下是一套資訊,linux下又是另外一套資訊,等等。具體的激活條件有哪些我在後文會講到

出現位置

  • 針對於特定項目的profile配置我們可以定義在該項目的pom.xml中。

  • 針對於特定用戶的profile配置,我們可以在用戶的settings.xml文件中定義profile。該文件在用戶家目錄下的「.m2」目錄下。

  • 全局的profile配置。全局的profile是定義在Maven安裝目錄下的「conf/settings.xml」文件中的

激活方式

  • 激活方式才是profiles運用的幾種表現,我們通過這些激活方式靈活實現部署到不同的環境中,對於不同的滿足條件我們提供不同的profile,profile我們有不同的配置,這樣就實現了部署的靈活性
    • 參數激活
    如下我們配置了兩個profile(zxh1,zxh2),兩個profile除了標識id還配置了參數properties.分別表示當屬性zxhtom值為single、double該激活的profile。
```    <profiles>         <profile>                <id>zxh1</id>                <properties>                       <zxhtom>single</zxhtom>                </properties>         </profile>         <profile>                <id>zxh2</id>                <properties>                       <zxhtom>double</zxhtom>                </properties>         </profile>    <profiles>  ```      +  環境激活      在部署是符合這些環境要求的電腦則會獲取到該profile的配置。這樣我們windows上配置和Linux上就不同了。      ```    <activation>      <os>       <!--激活profile的作業系統的名字 -->       <name>Windows 7</name>       <!--激活profile的作業系統所屬家族(如 'windows')  -->       <family>Windows</family>       <!--激活profile的作業系統體系結構  -->       <arch>x64</arch>       <!--激活profile的作業系統版本-->       <version>x.x.x..</version>      </os>    </activation>    ```      +  默認激活        *  activeByDefault激活          下面的配置在我們部署是沒有指定profile時,zxh1這個profile就會成為默認的profile,如果我們指定了那麼zxh1就不會被啟用。這裡要注意這裡是不啟用。和後面的activeProfiles激活不同。          ```        <profiles>              <profile>                   <id>zxh1</id>                   <properties>                          <zxhtom>single</zxhtom>                   </properties>                   <activation>                          <activeByDefault>true</activeByDefault>                   </activation>              </profile>                <profile>                   <id>zxh2</id>                   <properties>                          <zxhtom>double</zxhtom>                   </properties>              </profile>        </profiles>        ```          *  activeProfiles激活          如下圖中我們定義zxh1為激活狀態,另外我們如果在通過參數或者其他條件激活了zxh2,這裡zxh1和zxh2都是出於激活的,並不像activeByDefault激活那樣直接停止了。而是兩者的覆蓋值合併。          ```        <profiles>         <profile>                <id>zxh1</id>                <properties>                       <zxhtom>single</zxhtom>                </properties>         </profile>         <profile>                <id>zxh2</id>                <properties>                       <zxhtom>double</zxhtom>                </properties>         </profile>        <profiles>        <activeProfiles>           <activeProfile>zxh1</activeProfile>        </activeProfiles>        ```      檔如下在activeProfiles中配置了多個profile是,maven選擇的是後者覆蓋合併前者的方式,也就是將zxh1和zxh2合併,相同值去後者的值。        ```        <profiles>         <profile>                <id>zxh1</id>                <properties>                       <zxhtom>single</zxhtom>                </properties>         </profile>         <profile>                <id>zxh2</id>                <properties>                       <zxhtom>double</zxhtom>                </properties>         </profile>        <profiles>        <activeProfiles>           <activeProfile>zxh1</activeProfile>           <activeProfile>zxh2</activeProfile>        </activeProfiles>        ```      +  文件激活        ```      <activation>           <file>           <!--如果指定的文件存在,則激活profile。 -->           <exists>${basedir}/file2.properties</exists>           <!--如果指定的文件不存在,則激活profile。-->           <missing>${basedir}/file1.properties</missing>           </file>      </activation>      ```

[//]:maven setting參考網址:http://blog.csdn.net/liutengteng130/article/details/46991829
[//]:setting https://www.cnblogs.com/yangxia-test/p/4409736.html
[//]:pom http://blog.csdn.net/sunzhenhua0608/article/details/32938533
[//]:repositories : 遠程連接的倉庫。可以在setting中通過mirror做成鏡像
[//]:distributionManagement: 管理快照版本和正式版本
[//]:repository: 正式版本
[//]:snapshotRepository: 快照版本
[//]:dependencyManagement : 統一管理版本號

Tags: