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依賴說明