1. 程式人生 > >POM的語法規則

POM的語法規則

一、POM簡介

pom作為專案物件模型,通過使用pom.xml來實現管理maven專案,主要描述了專案的如下部分:配置檔案、開發者需要遵循的規則、缺陷管理系統、組織和licenses、專案的url、專案的依賴性和其它所有的專案相關因素。

二、POM的語法規則

一份比較全的pom.xml檔案可以參考如下,通過它我們來對pom.xml中的語法規則進行說明。

<project>
  <modelVersion>4.0.0</modelVersion>  <!--指定了當前pom版本-->
<!--maven2.0必須是這樣寫,現在是maven2唯一支援的版本-->
  <!-- 基礎設定 -->
  <groupId>...</groupId> <!--整個系統的名稱,-一般用反寫的公司網址+專案名,比如com.moxie.hi->
  <artifactId>...</artifactId> <!--子模組名稱,專案名+模組名-->
  <version>0.0.1-SNAPSHOT</version> <!--第一個數0表示大版本號;第二個數0表示分支版本號;第三個數1表示小版本號;SNAPSHOT 表示快照,另外還有alpha 內部測試、beta 公測、release 穩定、GA 正式釋出-->
  <packaging>...</packaging>  <!--打包型別,可取的值有war zip pom-->
  <name>...</name> <!--專案描述名-->
  <url>...</url> <!--專案地址-->
  <description>...</description> <!--專案描述-->
  <dependencies>...</dependencies> <!--依賴列表-->
  <parent>...</parent>
  <dependencyManagement>...</dependencyManagement> <!--依賴的管理-->
  <modules>...</modules> <!--聚合多個模組進行編譯-->
  <properties>...</properties>

  <!--構建設定 -->
  <build>...</build>
  <reporting>...</reporting>
 <!-- 更多專案資訊 -->
  <name>...</name>
  <description>...</description>
  <url>...</url>
  <inceptionYear>...</inceptionYear>
  <licenses>...</licenses>
  <organization>...</organization>
  <developers>...</developers>
  <contributors>...</contributors>

  <!-- 環境設定-->
  <issueManagement>...</issueManagement>
  <ciManagement>...</ciManagement>
  <mailingLists>...</mailingLists> 
  <scm>...</scm>
  <prerequisites>...</prerequisites>
  <repositories>...</repositories>
  <pluginRepositories>...</pluginRepositories>
  <distributionManagement>...</distributionManagement>
  <profiles>...</profiles>
</project>

上面關於pom.xml的描述不一定詳盡,下面做出部分補充。

2.1 依賴衝突的排查與解決

依賴衝突可以見此例,在專案中有兩個依賴項:A和B,但是A和B同時依賴了C,依賴的C不是同一個版本。
依賴衝突的排查,可以通過新增檢查外掛來發現,參考如下:

<reporting>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-project-info-reports-plugin</artifactId>
            </plugin>
        </plugins>
 </reporting>

執行命令:mvn project-info-reports:dependencies 可以檢視依賴報告。
去除衝突依賴項,可以考慮使用< exclusion>…< /exclusion>,比如我們需要在某個dependency中去除某個依賴項:

<!-- Struts2 -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>${struts.version}</version>
            <exclusions>
                <exclusion>  <!--去除依賴項-->
                    <groupId>org.freemarker</groupId>
                    <artifactId>freemarker</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2.2 POM中的繼承

maven提供繼承關係,子pom可以繼承父pom的配置資訊,因此可以在父pom中宣告一些可供子pom繼承的配置,實現“一次宣告,多次使用”。在子pom中關於繼承的寫法可以參考如下:

<modelVersion>4.0.0</modelVersion>
  <parent> <!--表示繼承關係-->
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream-parent</artifactId>
    <version>1.4.3</version>
  </parent>
  <artifactId>xstream</artifactId>
  <packaging>jar</packaging>
  <name>XStream Core</name>

上述繼承關係表示父pom是com.thoughtworks.xstream的xstream-parent的1.4.3版本。

2.3 POM中的聚合

在pom中可以通過一個大的專案來整合各個小的模組,這種整合關係可稱為POM的聚合

 <modules>
         <module>my-app</module>
 </modules>

2.4 Maven屬性

在pom.xml檔案中可以通過< properties>元素自定義一個或多個Maven屬性,然後再POM的其它地方使用${屬性名}的方式引用該屬性,這種做法的最大意義在於消除重複和統一管理。Maven總共有6類屬性,內建屬性、POM屬性、自定義屬性、Settings屬性、Java系統屬性和環境變數屬性。

1.內建屬性
常用的內建屬性有兩個,一個是${basedir}表示專案根目錄,即包含pom.xml檔案的目錄;一個是 ${version}表示專案版本。
2.POM屬性
使用者可以使用該類屬性引用POM檔案中對應元素的值。如 ${project.artifactId}就對應了< project>< artifactId>元素的值,常用的POM屬性包括:
$ { project.build.sourceDirectory}:專案的主原始碼目錄,預設為src/main/java/
$ {project.build.testSourceDirectory}:專案的測試原始碼目錄,預設為src/test/java/
$ {project.build.directory} : 專案構建輸出目錄,預設為target/
$ {project.outputDirectory} : 專案主程式碼編譯輸出目錄,預設為target/classes/
$ {project.testOutputDirectory}:專案測試主程式碼輸出目錄,預設為target/testclasses/
$ {project.groupId}:專案的groupId
$ {project.artifactId}:專案的artifactId
$ {project.version}:專案的version,與${version} 等價
$ {project.build.finalName}:專案打包輸出檔案的名稱,預設為${project.artifactId}- $ {project.version}
3.自定義屬性
自定義屬性在此略,可以自行百度查閱。
4.Settings屬性
與POM屬性同理,使用者可以使用settings。開頭的屬性引用settings.xml檔案中的元素的值。
5.Java系統屬性
所有Java系統屬性都可以用maven屬性引用,如 ${user.home}指向了使用者目錄。
6.環境變數屬性
所有環境變數屬性都可以使用env.開頭的Maven屬性引用,

2.5 POM 構建配置

構建中的外掛管理

<pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                        <tomcat-url>http://localhost:8080/manager/html</tomcat-url>
                        <server>tomcat_localtest</server>
                    </configuration>
                </plugin>
            </plugins>
</pluginManagement>

指定構建時需要的資源

<resources>
            <resource>
                <targetPath>WEB-INF/resource</targetPath>
                <!-- 不對檔案中的表示式進行處理 -->
                <filtering>false</filtering>
                <directory>${basedir}/src/test/resources</directory>
                <includes>
                    <include>include.xml</include>
                </includes>
                <excludes>
                    <exclude>exclude.xml</exclude>
                </excludes>
            </resource>
  </resources>

參考

1.maven pom聚合與繼承
2.Maven pom.xml中的元素modules、parent、properties以及import

3.Maven中POM.XML詳解
4.Maven常用命令和 pom.xml解析
5.SpringCloud註解和配置以及pom依賴說明