1. 程式人生 > 實用技巧 >JAVA配置檔案全解

JAVA配置檔案全解

1、setting.xml

maven的配置檔案settings.xml存在於兩個地方:

  • 安裝的地方:${M2_HOME}/conf/settings.xml
  • 使用者的目錄:${user.home}/.m2/settings.xml

前者又被叫做全域性配置,對作業系統的所有使用者生效;後者被稱為使用者配置,只對當前作業系統的使用者生效。如果兩者都存在,它們的內容將被合併,並且使用者範圍的settings.xml會覆蓋全域性的settings.xml。

Maven安裝後,使用者目錄下不會自動生成settings.xml,只有全域性配置檔案。如果需要建立使用者範圍的settings.xml,可以將安裝路徑下的settings複製到目錄​${user.home}/.m2/

。Maven預設的settings.xml是一個包含了註釋和例子的模板,可以快速的修改它來達到你的要求。

全域性配置一旦更改,所有的使用者都會受到影響,而且如果maven進行升級,所有的配置都會被清除,所以要提前複製和備份${M2_HOME}/conf/settings.xml檔案,一般情況下不推薦配置全域性的settings.xml。

下面的配置檔案對各個節點的含義及作用都有註解。實際應用中,經常使用的是<localRepository><servers><mirrors><profiles>有限幾個節點,其他節點使用預設值足夠應對大部分的應用場景。


<?xml version="1.0" encoding="UTF-8"?>
<settings
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    
    <!--本地倉庫。該值表示構建系統本地倉庫的路徑。其預設值為${user.home}/.m2/repository。  -->
    <localRepository>usr/local/maven</localRepository>
    
    <!--Maven是否需要和使用者互動以獲得輸入。如果Maven需要和使用者互動以獲得輸入,則設定成true,反之則應為false。預設為true。 -->
    <interactiveMode>true</interactiveMode>
    
    <!--Maven是否需要使用plugin-registry.xml檔案來管理外掛版本。
        如果設定為true,則在{user.home}/.m2下需要有一個plugin-registry.xml來對plugin的版本進行管理
        預設為false。 -->
    <usePluginRegistry>false</usePluginRegistry>
    
    <!--表示Maven是否需要在離線模式下執行。如果構建系統需要在離線模式下執行,則為true,預設為false。
        當由於網路設定原因或者安全因素,構建伺服器不能連線遠端倉庫的時候,該配置就十分有用。  -->
    <offline>false</offline>
    
    <!--當外掛的組織Id(groupId)沒有顯式提供時,供搜尋外掛組織Id(groupId)的列表。
        該元素包含一個pluginGroup元素列表,每個子元素包含了一個組織Id(groupId)。
        當我們使用某個外掛,並且沒有在命令列為其提供組織Id(groupId)的時候,Maven就會使用該列表。
        預設情況下該列表包含了org.apache.maven.plugins。 -->
    
    <pluginGroups>
        <!--plugin的組織Id(groupId)-->
        <pluginGroup>org.codehaus.mojo</pluginGroup>
    </pluginGroups>
    
    <!--用來配置不同的代理,多代理profiles可以應對筆記本或移動裝置的工作環境:通過簡單的設定profile id就可以很容易的更換整個代理配置 -->
    <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>
    
    <!--配置服務端的一些設定。一些設定如安全證書不應該和pom.xml一起分發。這種型別的資訊應該存在於構建伺服器上的settings.xml檔案中。 -->
    <servers>
        <!--伺服器元素包含配置伺服器時需要的資訊  -->
        <server>
            <!--這是server的id(注意不是使用者登陸的id),該id與distributionManagement中repository元素的id相匹配。 -->
            <id>server001</id>
            <!--鑑權使用者名稱。鑑權使用者名稱和鑑權密碼錶示伺服器認證所需要的登入名和密碼。  -->
            <username>my_login</username>
            <!--鑑權密碼 。鑑權使用者名稱和鑑權密碼錶示伺服器認證所需要的登入名和密碼。  -->
            <password>my_password</password>
            <!--鑑權時使用的私鑰位置。和前兩個元素類似,私鑰位置和私鑰密碼指定了一個私鑰的路徑
                (預設是/home/hudson/.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>
            <!--傳輸層額外的配置項  -->
            <configuration></configuration>
        </server>
    </servers>
    
    <!--為倉庫列表配置的下載映象列表。  -->
    <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://repo1.maven.org/maven2)的映象,就需要將該元素設定成central。這必須和中央倉庫的id central完全一致。 -->
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
    
    <!--根據環境引數來調整構建配置的列表。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。
        它包含了id,activation, repositories, pluginRepositories和 properties元素。
        這裡的profile元素只包含這五個子元素是因為這裡只關心構建系統這個整體(這正是settings.xml檔案的角色定位),而非單獨的專案物件模型設定。
        如果一個settings中的profile被啟用,它的值會覆蓋任何其它定義在POM中或者profile.xml中的帶有相同id的profile。  -->
    <profiles>
        
        <!--根據環境引數來調整的構件的配置 -->
        <profile>
            <!--該配置的唯一識別符號。  -->
            <id>test</id>
            
            <!--自動觸發profile的條件邏輯。Activation是profile的開啟鑰匙。
                如POM中的profile一樣,profile的力量來自於它能夠在某些特定的環境中自動使用某些特定的值;這些環境通過activation元素指定。
                activation元素並不是啟用profile的唯一方式。settings.xml檔案中的activeProfile元素可以包含profile的id。
                profile也可以通過在命令列,使用-P標記和逗號分隔的列表來顯式的啟用(如,-P test)。 -->
            <activation>
                <!--profile預設是否啟用的標識 -->
                <activeByDefault>false</activeByDefault>
                <!--activation有一個內建的java版本檢測,如果檢測到jdk版本與期待的一樣,profile被啟用。 -->
                <jdk>1.7</jdk>
                
                <!--當匹配的作業系統屬性被檢測到,profile被啟用。os元素可以定義一些作業系統相關的屬性。 -->
                <os>
                    <!--啟用profile的作業系統的名字  -->
                    <name>Windows XP</name>
                    <!--啟用profile的作業系統所屬家族(如 'windows')   -->
                    <family>Windows</family>
                    <!--啟用profile的作業系統體系結構   -->
                    <arch>x86</arch>
                    <!--啟用profile的作業系統版本 -->
                    <version>5.1.2600</version>
                </os>
                
                <!--如果Maven檢測到某一個屬性(其值可以在POM中通過${名稱}引用),其擁有對應的名稱和值,Profile就會被啟用。
                    如果值欄位是空的,那麼存在屬性名稱欄位就會啟用profile,否則按區分大小寫方式匹配屬性值欄位 -->
                <property>
                    <!--啟用profile的屬性的名稱 -->
                    <name>mavenVersion</name>
                    <!--啟用profile的屬性的值  -->
                    <value>2.0.3</value>
                </property>
                
                <!--提供一個檔名,通過檢測該檔案的存在或不存在來啟用profile。missing檢查檔案是否存在,如果不存在則啟用profile。
                    另一方面,exists則會檢查檔案是否存在,如果存在則啟用profile。 -->
                <file>
                    <!--如果指定的檔案存在,則啟用profile。  -->
                    <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
                    <!--如果指定的檔案不存在,則啟用profile。 -->
                    <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
                </file>
            </activation>
            
            <!--對應profile的擴充套件屬性列表。Maven屬性和Ant中的屬性一樣,可以用來存放一些值。這些值可以在POM中的任何地方使用標記${X}來使用,這裡X是指屬性的名稱。
                屬性有五種不同的形式,並且都能在settings.xml檔案中訪問。   
                   1. env.X: 在一個變數前加上"env."的字首,會返回一個shell環境變數。例如,"env.PATH"指代了$path環境變數(在Windows上是%PATH%)。   
                   2. project.x:指代了POM中對應的元素值。      
                   3. settings.x: 指代了settings.xml中對應元素的值。   
                   4. Java System Properties: 所有可通過java.lang.System.getProperties()訪問的屬性都能在POM中使用該形式訪問,   
                    如/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre。      
                   5. x: 在<properties/>元素中,或者外部檔案中設定,以${someVar}的形式使用。  -->
            <properties>
                <!-- 如果這個profile被啟用,那麼屬性${user.install}就可以被訪問了 -->
                <user.install>usr/local/winner/jobs/maven-guide</user.install>
            </properties>
            
            <!--遠端倉庫列表,它是Maven用來填充構建系統本地倉庫所使用的一組遠端專案。  -->
            <repositories>
                <!--包含需要連線到遠端倉庫的資訊  -->
                <repository>
                    <!--遠端倉庫唯一標識 -->
                    <id>codehausSnapshots</id>
                    <!--遠端倉庫名稱  -->
                    <name>Codehaus Snapshots</name>
                    
                    <!--如何處理遠端倉庫裡釋出版本的下載 -->
                    <releases>
                        <!--true或者false表示該倉庫是否為下載某種型別構件(釋出版,快照版)開啟。   -->
                        
<enabled>false</enabled> <!--該元素指定更新發生的頻率。Maven會比較本地POM和遠端POM的時間戳。這裡的選項是: always(一直),daily(預設,每日),interval:X(這裡X是以分鐘為單位的時間間隔),或者never(從不)。 --> <updatePolicy>always</updatePolicy> <!--當Maven驗證構件校驗檔案失敗時該怎麼做: ignore(忽略),fail(失敗),或者warn(警告)。 --> <checksumPolicy>warn</checksumPolicy> </releases> <!--如何處理遠端倉庫裡快照版本的下載。有了releases和snapshots這兩組配置,POM就可以在每個單獨的倉庫中,為每種型別的構件採取不同的策略。 例如,可能有人會決定只為開發目的開啟對快照版本下載的支援。參見repositories/repository/releases元素 --> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <!--遠端倉庫URL,按protocol://hostname/path形式 --> <url>http://snapshots.maven.codehaus.org/maven2</url> <!--用於定位和排序構件的倉庫佈局型別-可以是default(預設)或者legacy(遺留)。 Maven 2為其倉庫提供了一個預設的佈局;然而,Maven 1.x有一種不同的佈局。我們可以使用該元素指定佈局是default(預設)還是legacy(遺留)。 --> <layout>default</layout> </repository> </repositories> <!--發現外掛的遠端倉庫列表。倉庫是兩種主要構件的家。第一種構件被用作其它構件的依賴。這是中央倉庫中儲存的大部分構件型別。另外一種構件型別是外掛。 Maven外掛是一種特殊型別的構件。由於這個原因,外掛倉庫獨立於其它倉庫。pluginRepositories元素的結構和repositories元素的結構類似。 每個pluginRepository元素指定一個Maven可以用來尋找新外掛的遠端地址。 --> <pluginRepositories> <!--包含需要連線到遠端外掛倉庫的資訊.參見profiles/profile/repositories/repository元素的說明 --> <pluginRepository> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <id /> <name /> <url /> <layout /> </pluginRepository> </pluginRepositories> <!--手動啟用profiles的列表,按照profile被應用的順序定義activeProfile。 該元素包含了一組activeProfile元素,每個activeProfile都含有一個profile id。 任何在activeProfile中定義的profile id,不論環境設定如何,其對應的 profile都會被啟用。 如果沒有匹配的profile,則什麼都不會發生。例如,env-test是一個activeProfile,則在pom.xml(或者profile.xml)中對應id的profile會被啟用。 如果執行過程中找不到這樣一個profile,Maven則會像往常一樣執行。 --> <activeProfiles> <activeProfile>env-test</activeProfile> </activeProfiles> </profile> </profiles> </settings>

2、pom.xml

setting.xml主要用於配置maven的執行環境等一系列通用的屬性,是全域性級別的配置檔案;而pom.xml主要描述了專案的maven座標,依賴關係,開發者需要遵循的規則,缺陷管理系統,組織和licenses,以及其他所有的專案相關因素,是專案級別的配置檔案。

2.1 基礎配置

一個典型的pom.xml檔案配置如下:

<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <!-- 模型版本。maven2.0必須是這樣寫,現在是maven2唯一支援的版本 -->
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 公司或者組織的唯一標誌,並且配置時生成的路徑也是由此生成,
        如com.winner.trade,maven會將該專案打成的jar包放本地路徑:/com/winner/trade -->
    <groupId>com.winner.trade</groupId>
    
    <!-- 本專案的唯一ID,一個groupId下面可能多個專案,就是靠artifactId來區分的 -->
    <artifactId>trade-core</artifactId>
    
    <!-- 本專案目前所處的版本號 -->
    <version>1.0.0-SNAPSHOT</version>
    
    <!-- 打包的機制,如pom, jar, maven-plugin, ejb, war, ear, rar, par,預設為jar -->
    <packaging>jar</packaging>
    
    <!-- 幫助定義構件輸出的一些附屬構件,附屬構件與主構件對應,有時候需要加上classifier才能唯一的確定該構件
            不能直接定義專案的classifer,因為附屬構件不是專案直接預設生成的,而是由附加的外掛幫助生成的  -->
    <classifier>...</classifier>
    
    <!-- 定義本專案的依賴關係 -->
    <dependencies>
        
        <!-- 每個dependency都對應這一個jar包 -->
        <dependency>
            
            <!-- 一般情況下,maven是通過groupId、artifactId、version這三個元素值(俗稱座標)來檢索該構件,
                然後引入你的工程。如果別人想引用你現在開發的這個專案(前提是已開發完畢併發布到了遠端倉庫),
                就需要在他的pom檔案中新建一個dependency節點,將本專案的groupId、artifactId、version寫入,
                maven就會把你上傳的jar包下載到他的本地 -->
            <groupId>com.winner.trade</groupId>
            <artifactId>trade-test</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            
            <!-- maven認為,程式對外部的依賴會隨著程式的所處階段和應用場景而變化,所以maven中的依賴關係有作用域(scope)的限制。
                scope包含如下的取值:compile(編譯範圍)、provided(已提供範圍)、runtime(執行時範圍)、test(測試範圍)、system(系統範圍) -->
            <scope>test</scope>
            
            <!-- 設定指依賴是否可選,預設為false,即子專案預設都繼承:為true,則子專案必需顯示的引入,與dependencyManagement裡定義的依賴類似 。 -->
            <optional>false</optional>
            
            <!-- 遮蔽依賴關係。
                比如專案中使用的libA依賴某個庫的1.0版,libB依賴某個庫的2.0版,現在想統一使用2.0版,就應該遮蔽掉對1.0版的依賴 -->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    
    <!-- 為pom定義一些常量,在pom中的其它地方可以直接引用
        使用方式 如下 :${file.encoding} -->
    <properties>
        <file.encoding>UTF-8</file.encoding>
        <java.source.version>1.5</java.source.version>
        <java.target.version>1.5</java.target.version>
    </properties>

    ...

</project>

一般來說,上面的幾個配置項對任何專案都是必不可少的,定義了專案的基本屬性。

這裡有必要對一個不太常用的屬性classifier做一下解釋,因為有時候引用某個jar包,classifier不寫的話會報錯。

classifier元素用來幫助定義構件輸出的一些附屬構件。附屬構件與主構件對應,比如主構件是 kimi-app-2.0.0.jar,該專案可能還會通過使用一些外掛生成 如 kimi-app-2.0.0-javadoc.jar (Java文件)、 kimi-app-2.0.0-sources.jar(Java原始碼) 這樣兩個附屬構件。這時候,javadoc、sources就是這兩個附屬構件的classifier,這樣附屬構件也就擁有了自己唯一的座標。

classifier的用途在於:

  • maven download javadoc / sources jar包的時候,需要藉助classifier指明要下載那個附屬構件
  • 引入依賴的時候,有時候僅憑groupId、artifactId、version無法唯一的確定某個構件,需要藉助classifier來進一步明確目標。比如JSON-lib,有時候會同一個版本會提供多個jar包,在JDK1.5環境下是一套,在JDK1.3環境下是一套:
1.png

引用它的時候就要註明JDK版本,否則maven不知道你到底需要哪一套jar包:

<dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier> 
</dependency>

2.2 構建配置

<build>

    <!-- 產生的構件的檔名,預設值是${artifactId}-${version}。 --> 
    <finalName>myPorjectName</finalName> 

    <!-- 構建產生的所有檔案存放的目錄,預設為${basedir}/target,即專案根目錄下的target --> 
    <directory>${basedir}/target</directory> 
    
    <!-- 當專案沒有規定目標(Maven2 叫做階段(phase))時的預設值,
        必須跟命令列上的引數相同例如jar:jar,或者與某個階段(phase)相同例如install、compile等 --> 
    <defaultGoal>install</defaultGoal>
        
    <!-- 當filtering開關開啟時,使用到的過濾器屬性檔案列表。
        專案配置資訊中諸如${spring.version}之類的佔位符會被屬性檔案中的實際值替換掉 --> 
    <filters>
            <filter>../filter.properties</filter>
    </filters> 
    
    <!-- 專案相關的所有資源路徑列表,例如和專案相關的配置檔案、屬性檔案,這些資源被包含在最終的打包檔案裡。 --> 
    <resources> 
        <resource> 
        
            <!-- 描述了資源的目標路徑。該路徑相對target/classes目錄(例如${project.build.outputDirectory})。
            舉個例子,如果你想資源在特定的包裡(org.apache.maven.messages),你就必須該元素設定為org/apache/maven/messages。
            然而,如果你只是想把資源放到原始碼目錄結構裡,就不需要該配置。 --> 
            <targetPath>resources</targetPath> 
            
            <!-- 是否使用引數值代替引數名。引數值取自properties元素或者檔案裡配置的屬性,檔案在filters元素裡列出。 --> 
            <filtering>true</filtering> 
            
            <!-- 描述存放資源的目錄,該路徑相對POM路徑 --> 
            <directory>src/main/resources</directory> 
            
            <!-- 包含的模式列表 --> 
            <includes>  
                <include>**/*.properties</include>  
                <include>**/*.xml</include>  
            </includes>  
            
            <!-- 排除的模式列表
                如果<include>與<exclude>劃定的範圍存在衝突,以<exclude>為準 --> 
            <excludes>  
                <exclude>jdbc.properties</exclude>  
                </excludes> 
        
        </resource> 
    </resources> 
    
    <!-- 單元測試相關的所有資源路徑,配製方法與resources類似--> 
    <testResources> 
        <testResource> 
            <targetPath /><filtering /><directory /><includes /><excludes /> 
        </testResource> 
    </testResources> 
    
    <!-- 專案原始碼目錄,當構建專案的時候,構建系統會編譯目錄裡的原始碼。該路徑是相對於pom.xml的相對路徑。 --> 
    <sourceDirectory>${basedir}\src\main\java</sourceDirectory> 
    
    <!-- 專案指令碼原始碼目錄,該目錄和原始碼目錄不同,
        絕大多數情況下,該目錄下的內容會被拷貝到輸出目錄(因為指令碼是被解釋的,而不是被編譯的)。 --> 
    <scriptSourceDirectory>${basedir}\src\main\scripts</scriptSourceDirectory>
    
    <!-- 專案單元測試使用的原始碼目錄,當測試專案的時候,構建系統會編譯目錄裡的原始碼。該路徑是相對於pom.xml的相對路徑。 --> 
    <testSourceDirectory>${basedir}\src\test\java</testSourceDirectory>
    
    <!-- 被編譯過的應用程式class檔案存放的目錄。 --> 
    <outputDirectory>${basedir}\target\classes</outputDirectory>
    
    <!-- 被編譯過的測試class檔案存放的目錄。 --> 
    <testOutputDirectory>${basedir}\target\test-classes</testOutputDirectory> 
    
    <!-- 專案的一系列構建擴充套件,它們是一系列build過程中要使用的產品,會包含在running bulid‘s classpath裡面。
        他們可以開啟extensions,也可以通過提供條件來啟用plugins。
        簡單來講,extensions是在build過程被啟用的產品--> 
    <extensions> 
    
        <!-- 例如,通常情況下,程式開發完成後部署到線上Linux伺服器,可能需要經歷打包、
            將包檔案傳到伺服器、SSH連上伺服器、敲命令啟動程式等一系列繁瑣的步驟。
            實際上這些步驟都可以通過Maven的一個外掛 wagon-maven-plugin 來自動完成
            下面的擴充套件外掛wagon-ssh用於通過SSH的方式連線遠端伺服器,
            類似的還有支援ftp方式的wagon-ftp外掛 --> 
        <extension> 
            <groupId>org.apache.maven.wagon</groupId>
            <artifactId>wagon-ssh</artifactId>
            <version>2.8</version>
        </extension> 
    
    </extensions> 

    <!-- 使用的外掛列表 。 --> 
    <plugins> 
        <plugin> 
            <groupId></groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>
            
            <!-- 在構建生命週期中執行一組目標的配置。每個目標可能有不同的配置。 --> 
            <executions>
                <execution>
                
                        <!-- 執行目標的識別符號,用於標識構建過程中的目標,或者匹配繼承過程中需要合併的執行目標 --> 
                    <id>assembly</id>
                    
                    <!-- 綁定了目標的構建生命週期階段,如果省略,目標會被繫結到源資料裡配置的預設階段 --> 
                    <phase>package</phase>
                    
                    <!-- 配置的執行目標 --> 
                    <goals>
                        <goal>single</goal>
                    </goals>
                    
                    <!-- 配置是否被傳播到子POM --> 
                    <inherited>false</inherited> 
                    
                </execution>
            </executions>
            
            <!-- 作為DOM物件的配置,配置項因外掛而異 -->
            <configuration>
                <finalName>${finalName}</finalName>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptor>assembly.xml</descriptor>
            </configuration>
        
            <!-- 是否從該外掛下載Maven擴充套件(例如打包和型別處理器),
                由於效能原因,只有在真需要下載時,該元素才被設定成true。 --> 
            <extensions>false</extensions> 
            
            <!-- 專案引入外掛所需要的額外依賴 --> 
            <dependencies> 
                <dependency>...</dependency> 
            </dependencies> 
            
            <!-- 任何配置是否被傳播到子專案 --> 
            <inherited>true</inherited>
        
        </plugin> 
    </plugins> 
 
    <!-- 主要定義外掛的共同元素、擴充套件元素集合,類似於dependencyManagement,
        所有繼承於此專案的子專案都能使用。該外掛配置項直到被引用時才會被解析或繫結到生命週期。
        給定外掛的任何本地配置都會覆蓋這裡的配置 --> 
    <pluginManagement> 
        <plugins>...</plugins>
    </pluginManagement>
    
</build>

pom裡面的倉庫與setting.xml裡的倉庫功能是一樣的。主要的區別在於,pom裡的倉庫是個性化的。比如一家大公司裡的setting檔案是公用的,所有專案都用一個setting檔案,但各個子專案卻會引用不同的第三方庫,所以就需要在pom裡設定自己需要的倉庫地址。

2.3 分發配置

<!-- 專案分發資訊,在執行mvn deploy後表示要釋出的位置。
    有了這些資訊就可以把網站部署到遠端伺服器或者把構件部署到遠端倉庫。 --> 
<distributionManagement> 

    <!-- 部署專案產生的構件到遠端倉庫需要的資訊 --> 
    <repository> 
    
        <!-- 是分配給快照一個唯一的版本號(由時間戳和構建流水號),還是每次都使用相同的版本號
            參見repositories/repository元素 --> 
        <uniqueVersion>true</uniqueVersion> 
        
        <id> repo-id </id> 
        <name> repo-name </name> 
        <url> file://${basedir}/target/deploy </url> 
        <layout /> 
    
    </repository> 

    <!-- 構件的快照部署到哪裡,如果沒有配置該元素,預設部署到repository元素配置的倉庫 --> 
    <snapshotRepository> 
        <uniqueVersion /> 
        <id />
        <name /> 
        <url /> 
        <layout /> 
    </snapshotRepository> 

    <!-- 部署專案的網站需要的資訊 --> 
    <site> 
    
        <!-- 部署位置的唯一識別符號,用來匹配站點和settings.xml檔案裡的配置 --> 
        <id> site-id </id> 
        
        <!-- 部署位置的名稱 --> 
        <name> site-name </name> 
        
        <!-- 部署位置的URL,按protocol://hostname/path形式 --> 
        <url> scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url> 
    
    </site> 

    <!-- 專案下載頁面的URL。如果沒有該元素,使用者應該參考主頁。
        使用該元素的原因是:幫助定位那些不在倉庫裡的構件(由於license限制)。 --> 
    <downloadUrl /> 
    
    <!-- 如果構件有了新的group ID和artifact ID(構件移到了新的位置),這裡列出構件的重定位資訊。 --> 
    <relocation> 
    
        <!-- 構件新的group ID --> 
        <groupId /> 
        
        <!-- 構件新的artifact ID --> 
        <artifactId /> 
        
        <!-- 構件新的版本號 --> 
        <version /> 
        
        <!-- 顯示給使用者的,關於移動的額外資訊,例如原因。 --> 
        <message /> 
    
    </relocation> 
    
    <!-- 給出該構件在遠端倉庫的狀態。不得在本地專案中設定該元素,因為這是工具自動更新的。有效的值有:none(預設),converted(倉庫管理員從Maven 1 POM轉換過來),partner(直接從夥伴Maven 2倉庫同步過來),deployed(從Maven 2例項部署),verified(被核實時正確的和最終的)。 --> 
    <status /> 

</distributionManagement>

2.4 倉庫配置

<!-- 發現依賴和擴充套件的遠端倉庫列表。 --> 
<repositories> 

    <!-- 包含需要連線到遠端倉庫的資訊 --> 
    <repository> 
    
        <!-- 如何處理遠端倉庫裡釋出版本的下載 --> 
        <releases> 
        
            <!-- true或者false表示該倉庫是否為下載某種型別構件(釋出版,快照版)開啟。 --> 
            <enabled /> 
            
            <!-- 該元素指定更新發生的頻率。Maven會比較本地POM和遠端POM的時間戳。
                這裡的選項是:always(一直),daily(預設,每日),
                interval:X(這裡X是以分鐘為單位的時間間隔),或者never(從不)。 --> 
            <updatePolicy /> 
            
            <!-- 當Maven驗證構件校驗檔案失敗時該怎麼做:
                ignore(忽略),fail(失敗),或者warn(警告)。 --> 
            <checksumPolicy /> 
        
        </releases> 
        
        <!-- 如何處理遠端倉庫裡快照版本的下載。有了releases和snapshots這兩組配置,
            POM就可以在每個單獨的倉庫中,為每種型別的構件採取不同的策略。
            例如,可能有人會決定只為開發目的開啟對快照版本下載的支援 --> 
        <snapshots> 
            <enabled /><updatePolicy /><checksumPolicy /> 
        </snapshots> 
        
        <!-- 遠端倉庫唯一識別符號。可以用來匹配在settings.xml檔案裡配置的遠端倉庫 --> 
        <id> repo-id </id> 
        
        <!-- 遠端倉庫名稱 --> 
        <name> repo-name </name> 
        
        <!-- 遠端倉庫URL,按protocol://hostname/path形式 --> 
        <url> http://192.168.1.169:9999/repository/ </url> 
        
        <!-- 用於定位和排序構件的倉庫佈局型別-可以是default(預設)或者legacy(遺留)。
            Maven 2為其倉庫提供了一個預設的佈局;
            然而,Maven 1.x有一種不同的佈局。
            我們可以使用該元素指定佈局是default(預設)還是legacy(遺留)。 --> 
        <layout> default </layout> 
    
    </repository> 

</repositories> 

<!-- 發現外掛的遠端倉庫列表,這些外掛用於構建和報表 --> 
<pluginRepositories> 

    <!-- 包含需要連線到遠端外掛倉庫的資訊.參見repositories/repository元素 --> 
    <pluginRepository /> 

</pluginRepositories>

2.5 報表配置

<!-- 描述使用報表外掛產生報表的規範,特定的maven 外掛能輸出相應的定製和配置報表.
當用戶執行“mvn site”,這些報表就會執行,在頁面導航欄能看到所有報表的連結。 --> 
<reporting> 

    <!-- true,則網站不包括預設的報表。這包括“專案資訊”選單中的報表。 --> 
    <excludeDefaults /> 
    
    <!-- 所有產生的報表存放到哪裡。預設值是${project.build.directory}/site。 --> 
    <outputDirectory /> 

    <!-- 使用的報表外掛和他們的配置。 --> 
    <plugins> 
    
        <plugin> 
            <groupId /> 
            <artifactId />
            <version />
            <inherited />
            <configuration> 
                <links> 
                    <link>http://java.sun.com/j2se/1.5.0/docs/api/</link> 
                </links> 
            </configuration>
            <!-- 一組報表的多重規範,每個規範可能有不同的配置。
            一個規範(報表集)對應一個執行目標 。例如,有1,2,3,4,5,6,7,8,9個報表。
            1,2,5構成A報表集,對應一個執行目標。2,5,8構成B報表集,對應另一個執行目標 --> 
            <reportSets> 
            
                <!-- 表示報表的一個集合,以及產生該集合的配置 --> 
                <reportSet> 
                
                    <!-- 報表集合的唯一識別符號,POM繼承時用到 --> 
                    <id>sunlink</id> 
                    
                    <!-- 產生報表集合時,被使用的報表的配置 --> 
                    <configuration /> 
                    
                    <!-- 配置是否被繼承到子POMs --> 
                    <inherited /> 
                    
                    <!-- 這個集合裡使用到哪些報表 --> 
                    <reports>
                        <report>javadoc</report>  
                    </reports>
                    
                </reportSet> 
            
            </reportSets> 
        
        </plugin> 
    
    </plugins> 

</reporting>    

2.6 專案配置

<!-- 專案的問題管理系統(Bugzilla, Jira, Scarab,或任何你喜歡的問題管理系統)的名稱和URL,本例為 jira --> 
<issueManagement> 

    <!-- 問題管理系統(例如jira)的名字, --> 
    <system> jira </system> 
    
    <!-- 該專案使用的問題管理系統的URL --> 
    <url> http://jira.clf.com/ </url> 

</issueManagement> 

<!-- 專案持續整合資訊 --> 
<ciManagement> 

    <!-- 持續整合系統的名字,例如continuum --> 
    <system /> 
    
    <!-- 該專案使用的持續整合系統的URL(如果持續整合系統有web介面的話)。 --> 
    <url /> 
    
    <!-- 構建完成時,需要通知的開發者/使用者的配置項。包括被通知者資訊和通知條件(錯誤,失敗,成功,警告) --> 
    <notifiers> 
    
        <!-- 配置一種方式,當構建中斷時,以該方式通知使用者/開發者 --> 
        <notifier> 
        
            <!-- 傳送通知的途徑 --> 
            <type /> 
            
            <!-- 發生錯誤時是否通知 --> 
            <sendOnError /> 
            
            <!-- 構建失敗時是否通知 --> 
            <sendOnFailure /> 
            
            <!-- 構建成功時是否通知 --> 
            <sendOnSuccess /> 
            
            <!-- 發生警告時是否通知 --> 
            <sendOnWarning /> 
            
            <!-- 不贊成使用。通知傳送到哪裡 --> 
            <address /> 
            
            <!-- 擴充套件配置項 --> 
            <configuration /> 
        
        </notifier> 
    
    </notifiers> 

</ciManagement>

<!-- 專案的名稱, Maven產生的文件用 --> 
<name> banseon-maven </name> 

<!-- 專案主頁的URL, Maven產生的文件用 --> 
<url> http://www.clf.com/ </url> 

<!-- 專案的詳細描述, Maven 產生的文件用。 當這個元素能夠用HTML格式描述時
    (例如,CDATA中的文字會被解析器忽略,就可以包含HTML標籤),不鼓勵使用純文字描述。
    如果你需要修改產生的web站點的索引頁面,你應該修改你自己的索引頁檔案,而不是調整這裡的文件。 --> 
<description> A maven project to study maven. </description> 

<!-- 描述了這個專案構建環境中的前提條件。 --> 
<prerequisites> 

    <!-- 構建該專案或使用該外掛所需要的Maven的最低版本 --> 
    <maven /> 

</prerequisites> 

<!-- 專案建立年份,4位數字。當產生版權資訊時需要使用這個值。 --> 
<inceptionYear /> 

<!-- 專案相關郵件列表資訊 --> 
<mailingLists> 

    <!-- 該元素描述了專案相關的所有郵件列表。自動產生的網站引用這些資訊。 --> 
    <mailingList> 
    
        <!-- 郵件的名稱 --> 
        <name> Demo </name> 
        
        <!-- 傳送郵件的地址或連結,如果是郵件地址,建立文件時,mailto: 連結會被自動建立 --> 
        <post> [email protected] </post> 
        
        <!-- 訂閱郵件的地址或連結,如果是郵件地址,建立文件時,mailto: 連結會被自動建立 --> 
        <subscribe> [email protected] </subscribe> 
        
        <!-- 取消訂閱郵件的地址或連結,如果是郵件地址,建立文件時,mailto: 連結會被自動建立 --> 
        <unsubscribe> [email protected] </unsubscribe> 
        
        <!-- 你可以瀏覽郵件資訊的URL --> 
        <archive> http:/hi.clf.com/ </archive> 
    
    </mailingList> 

</mailingLists> 

<!-- 專案開發者列表 --> 
<developers> 

    <!-- 某個專案開發者的資訊 --> 
    <developer> 
    
        <!-- SCM裡專案開發者的唯一識別符號 --> 
        <id> HELLO WORLD </id> 
        
        <!-- 專案開發者的全名 --> 
        <name> banseon </name> 
        
        <!-- 專案開發者的email --> 
        <email> [email protected] </email> 
        
        <!-- 專案開發者的主頁的URL --> 
        <url /> 
        
        <!-- 專案開發者在專案中扮演的角色,角色元素描述了各種角色 --> 
        <roles> 
            <role> Project Manager </role> 
            <role> Architect </role> 
        </roles> 
        
        <!-- 專案開發者所屬組織 --> 
        <organization> demo </organization> 
        
        <!-- 專案開發者所屬組織的URL --> 
        <organizationUrl> http://hi.clf.com/ </organizationUrl> 
        
        <!-- 專案開發者屬性,如即時訊息如何處理等 --> 
        <properties> 
            <dept> No </dept> 
        </properties> 
        
        <!-- 專案開發者所在時區, -11到12範圍內的整數。 --> 
        <timezone> -5 </timezone> 
    
    </developer> 

</developers> 

<!-- 專案的其他貢獻者列表 --> 
<contributors> 

    <!-- 專案的其他貢獻者。參見developers/developer元素 --> 
    <contributor> 
        <name /><email /><url /><organization /><organizationUrl />
        <roles /><timezone /><properties /> 
    </contributor> 

</contributors> 

<!-- 該元素描述了專案所有License列表。應該只列出該專案的license列表,不要列出依賴專案的license列表。
    如果列出多個license,使用者可以選擇它們中的一個而不是接受所有license。 --> 
<licenses> 

    <!-- 描述了專案的license,用於生成專案的web站點的license頁面,其他一些報表和validation也會用到該元素。 --> 
    <license> 
    
        <!-- license用於法律上的名稱 --> 
        <name> Apache 2 </name> 
        
        <!-- 官方的license正文頁面的URL --> 
        <url> http://www.clf.com/LICENSE-2.0.txt </url> 
        
        <!-- 專案分發的主要方式: 
        repo,可以從Maven庫下載 
        manual, 使用者必須手動下載和安裝依賴 --> 
        <distribution> repo </distribution> 
        
        <!-- 關於license的補充資訊 --> 
        <comments> A business-friendly OSS license </comments> 
    
    </license> 

</licenses> 

<!-- SCM(Source Control Management)標籤允許你配置你的程式碼庫,供Maven web站點和其它外掛使用。 --> 
<scm> 

    <!-- SCM的URL,該URL描述了版本庫和如何連線到版本庫。欲知詳情,請看SCMs提供的URL格式和列表。該連線只讀。 --> 
    <connection>scm:svn:http://svn.baidu.com/banseon/maven/</connection> 
    
    <!-- 給開發者使用的,類似connection元素。即該連線不僅僅只讀 --> 
    <developerConnection>scm:svn:http://svn.baidu.com/banseon/maven/</developerConnection> 
    
    <!-- 當前程式碼的標籤,在開發階段預設為HEAD --> 
    <tag /> 
    
    <!-- 指向專案的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL。 --> 
    <url> http://svn.baidu.com/banseon </url> 

</scm> 

<!-- 描述專案所屬組織的各種屬性。Maven產生的文件用 --> 
<organization> 

    <!-- 組織的全名 --> 
    <name> demo </name> 
    
    <!-- 組織主頁的URL --> 
    <url> http://www.clf.com/ </url> 

</organization> 

3、profile

pom.xml中的profile可以看做pom.xml的副本,擁有與pom.xml相同的子元素與配置方法。它包含可選的activation(profile的觸發器)和一系列的changes。例如test過程可能會指向不同的資料庫(相對最終的deployment)或者不同的dependencies或者不同的repositories,並且是根據不同的JDK來改變的。只需要其中一個成立就可以啟用profile,如果第一個條件滿足了,那麼後面就不會在進行匹配。

<!-- 在列的專案構建profile,如果被啟用,會修改構建處理 --> 
<profiles> 

    <!-- 根據環境引數或命令列引數啟用某個構建處理 --> 
    <profile> 
        <!--自動觸發profile的條件邏輯。Activation是profile的開啟鑰匙。-->
        <activation>
              
             <!--profile預設是否啟用的標識 -->
            <activeByDefault>false</activeByDefault>
              
             <!--activation有一個內建的java版本檢測,如果檢測到jdk版本與期待的一樣,profile被啟用。 -->
            <jdk>1.7</jdk>
              
             <!--當匹配的作業系統屬性被檢測到,profile被啟用。os元素可以定義一些作業系統相關的屬性。 -->
            <os>
                  
                 <!--啟用profile的作業系統的名字  -->
                <name>Windows XP</name>
                  
                 <!--啟用profile的作業系統所屬家族(如 'windows')   -->
                <family>Windows</family>
                  
                 <!--啟用profile的作業系統體系結構   -->
                <arch>x86</arch>
                  
                 <!--啟用profile的作業系統版本 -->
                <version>5.1.2600</version>
                    
            </os>
              
             <!--如果Maven檢測到某一個屬性(其值可以在POM中通過${名稱}引用),其擁有對應的名稱和值,Profile就會被啟用。
                如果值欄位是空的,那麼存在屬性名稱欄位就會啟用profile,否則按區分大小寫方式匹配屬性值欄位 -->
            <property>
                  
                 <!--啟用profile的屬性的名稱 -->
                <name>mavenVersion</name>
                  
                 <!--啟用profile的屬性的值  -->
                <value>2.0.3</value>
                    
            </property>
              
             <!--提供一個檔名,通過檢測該檔案的存在或不存在來啟用profile。missing檢查檔案是否存在,如果不存在則啟用profile。
                另一方面,exists則會檢查檔案是否存在,如果存在則啟用profile。 -->
            <file>
                  
                 <!--如果指定的檔案存在,則啟用profile。  -->
                <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
                  
                 <!--如果指定的檔案不存在,則啟用profile。 -->
                <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
                    
            </file>
               
        </activation>
        <id /> 
        <build />
        <modules /> 
        <repositories /> 
        <pluginRepositories /> 
        <dependencies /> 
        <reporting /> 
        <dependencyManagement /> 
        <distributionManagement /> 
        <properties /> 
    </profile>

profile可以讓maven能夠自動適應外部的環境變化,比如同一個專案,在linux下編譯linux的版本,在win下編譯win的版本等。一個專案可以設定多個profile,也可以在同一時間設定多個profile被啟用(active)的。自動啟用的 profile的條件可以是各種各樣的設定條件,組合放置在activation節點中,也可以通過命令列直接指定。如果認為profile設定比較複雜,可以將所有的profiles內容移動到專門的 profiles.xml 檔案中,不過記得和pom.xml放在一起。

activation節點是設定該profile在什麼條件下會被啟用,常見的條件有如下幾個:

  • os

判斷作業系統相關的引數,它包含如下可以自由組合的子節點元素

  1. message - 規則失敗之後顯示的訊息
  2. arch - 匹配cpu結構,常見為x86
  3. family - 匹配作業系統家族,常見的取值為:dos,mac,netware,os/2,unix,windows,win9x,os/400等
  4. name - 匹配作業系統的名字
  5. version - 匹配的作業系統版本號
  6. display - 檢測到作業系統之後顯示的資訊
  • jdk

檢查jdk版本,可以用區間表示。

  • property

檢查屬性值,本節點可以包含name和value兩個子節點。

  • file

檢查檔案相關內容,包含兩個子節點:exists和missing,用於分別檢查檔案存在和不存在兩種情況。

如果想要某個profile預設處於啟用狀態,可以在<activeProfiles>中將該profile的id放進去。這樣,不論環境設定如何,其對應的 profile都會被啟用。

profile配置項在setting.xml中頁有,是pom.xml中profile元素的裁剪版本,包含了id,activation, repositories, pluginRepositories和 properties元素。這裡的profile元素只包含這五個子元素是因為setting.xml只關心構建系統這個整體(這正是settings.xml檔案的角色定位),而非單獨的專案物件模型設定。如果一個settings中的profile被啟用,它的值會覆蓋任何其它定義在POM中或者profile.xml中的帶有相同id的profile



轉載連結:https://www.jianshu.com/p/06f73e8cbf78