POM是項目對象模型(Project Object Model)的簡稱,它是Maven項目中的文件,使用XML表示,名稱叫作pom.xml。做用相似ant的build.xml文件,功能更強大。該文件用於管理:源代碼、配置文件、開發者的信息和角色、問題追蹤系統、組織信息、項目受權、項目的url、項目的依賴關係等等。事實上,在Maven世界中,project能夠什麼都沒有,甚至沒有代碼,可是必須包含pom.xml文件。html
下面是一個POM項目中的pom.xml文件中包含的元素。注意,其中的modelVersion是4.0.0,這是當前僅有的能夠被Maven2&3同時支持的POM版本,它是必須的。java
<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">
<modelVersion>4.0.0</modelVersion>
<!-- 基本設置 The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- 構建過程的設置 Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- 項目信息設置 More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 環境設置 Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
一個最簡單的pom.xml的定義必須包含modelVersion、groupId、artifactId和version這四個元素,固然這其中的元素也是能夠從它的父項目中繼承的。在Maven中,使用groupId、artifactId和version組成groupdId:artifactId:version的形式來惟一肯定一個項目:web
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 含義:組織標識,定義了項目屬於哪一個組,風向標,座標,或者說若把本項目打包 用途:此名稱則是本地倉庫中的路徑,列如:otowa.user.dao,在M2_REPO目錄下,將是: otowa/user/dao目錄 命名規範:項目名稱,模塊,子模塊 -->
<groupId>otowa.user.dao</groupId>
<!-- 含義:項目名稱也能夠說你所模塊名稱,定義當面Maven項目在組中惟一的ID 用途:例如:user-dao,在M2_REPO目錄下,將是:otowa/user/dao/user-dao目錄 命名規範:惟一就好 -->
<artifactId>user-dao</artifactId>
<!-- 含義:項目當前的版本號 用途:例如:0.0.1-SNAPSHOT,在M2_REPO目錄下,將是:otowa/user/dao/user-dao/0.0.1-SNAPSHOT目錄 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 打包的格式,能夠爲:pom , jar , maven-plugin , ejb , war , ear , rar , par -->
<packaging>war</packaging>
<!-- 元素聲明瞭一個對用戶更爲友好的項目名稱 -->
<name>maven</name>
</project>
咱們知道Maven在創建項目的時候是基於Maven項目下的pom.xml進行的,咱們項目依賴的信息和一些基本信息都是在這個文件裏面定義的。那若是當咱們有多個項目要進行,這多個項目有些配置內容是相同的,有些是要彼此關聯的,那若是按照傳統的作法的話咱們就須要在多個項目中都定義這些重複的內容。這無疑是很是耗費時間和不易維護的。好在Maven給咱們提供了一個pom的繼承和聚合的功能。express
對於使用java的人而言,繼承這個詞你們應該都不陌生。要繼承pom就須要有一個父pom,在Maven中定義了超級pom.xml,任何沒有申明本身父pom.xml的pom.xml都將默認繼承自這個超級pom.xml。apache
位置:api
在Maven 2.xxx版本中,好比maven-2.0.9-uber.jar,打開此Jar文件後,在包包org.apache.maven.project下會有pom-4.0.0.xml的文件。
可是到了3.xxx版本以後在: aven安裝目錄下的:/lib/maven-model-builder-version.jar中 \org\apache\maven\mode目錄中的pom-4.0.0.xml。tomcat
先來看一下這個超級pom.xml的定義:app
<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->
<!-- START SNIPPET: superpom -->
<project>
<modelVersion>4.0.0</modelVersion>
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<build>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
<!-- NOTE: These plugins will be removed from future versions of the super POM -->
<!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<reporting>
<outputDirectory>${project.build.directory}/site</outputDirectory>
</reporting>
<profiles>
<!-- NOTE: The release profile will be removed from future versions of the super POM -->
<profile>
<id>release-profile</id>
<activation>
<property>
<name>performRelease</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
<!-- END SNIPPET: superpom -->
對於一個pom.xml來講有幾個元素是必須定義的,一個是project根元素,而後就是它裏面的modelVersion、groupId、artifactId和version。由上面的超級pom.xml的內容咱們能夠看到pom.xml中沒有groupId、artifactId和version的定義,因此咱們在創建本身的pom.xml的時候就須要定義這三個元素。和java裏面的繼承相似,子pom.xml會徹底繼承父pom.xml中全部的元素,並且對於相同的元素,通常子pom.xml中的會覆蓋父pom.xml中的元素,可是有幾個特殊的元素它們會進行合併而不是覆蓋。這些特殊的元素是:框架
如今假設咱們有一個項目projectA,它的pom.xml定義以下:less
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
而後咱們有另外一個項目projectB,並且projectB是跟projectA的pom.xml文件處於同一個目錄下,這時候若是projectB須要繼承自projectA的話咱們能夠這樣定義projectB的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/maven-v4_0_0.xsd">
<parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
由projectB的pom.xml文件的定義咱們能夠知道,當須要繼承指定的一個Maven項目時,咱們須要在本身的pom.xml中定義一個parent元素,在這個元素中指明須要繼承項目的groupId、artifactId和version。
當被繼承項目與繼承項目的目錄結構不是父子關係的時候,咱們再利用上面的配置是不能實現Maven項目的繼承關係的,這個時候咱們就須要在子項目的pom.xml文件定義中的parent元素下再加上一個relativePath元素的定義,用以描述父項目的pom.xml文件相對於子項目的pom.xml文件的位置。
假設咱們如今仍是有上面兩個項目,projectA和projectB,projectB仍是繼承自projectA,可是如今projectB不在projectA的子目錄中,而是與projectA處於同一目錄中。這個時候projectA和projectB的目錄結構以下:
------projectA
------pom.xml
------projectB
------pom.xml
這個時候咱們能夠看出projectA的pom.xml相對於projectB的pom.xml的位置是「../projectA/pom.xml」,因此這個時候projectB的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/maven-v4_0_0.xsd">
<parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../projectA/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
對於聚合這個概念搞java的人應該都不會陌生。先來講說我對聚合和被聚合的理解,好比說若是projectA聚合到projectB,那麼咱們就能夠說projectA是projectB的子模塊, projectB是被聚合項目,也能夠相似於繼承那樣稱爲父項目。對於聚合而言,這個主體應該是被聚合的項目。因此,咱們須要在被聚合的項目中定義它的子模塊,而不是像繼承那樣在子項目中定義父項目。具體作法是:
對於聚合而言,當咱們在被聚合的項目上使用Maven命令時,實際上這些命令都會在它的子模塊項目上使用。這就是Maven中聚合的一個很是重要的做用。假設這樣一種狀況,你同時須要打包或者編譯projectA、projectB、projectC和projectD,按照正常的邏輯咱們一個一個項目去使用mvn compile或mvn package進行編譯和打包,對於使用Maven而言,你仍是這樣使用的話是很是麻煩的。由於Maven給咱們提供了聚合的功能。咱們只須要再定義一個超級項目,而後在超級項目的pom.xml中定義這個幾個項目都是聚合到這個超級項目的。以後咱們只須要對這個超級項目進行mvn compile,它就會把那些子模塊項目都進行編譯。
還拿上面定義的projectA和projectB來舉例子,如今假設咱們須要把projectB聚合到projectA中。projectA和projectB的目錄結構以下所示:
------projectA
------projectB
-----pom.xml
------pom.xml
這個時候projectA的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>projectB</module>
</modules>
</project>
由上面的定義咱們能夠看到被聚合的項目的packaging類型應該爲pom,並且一個項目能夠有多個子模塊項目。對於聚合這種狀況,咱們使用子模塊項目的artifactId來做爲module的值,表示子模塊項目相對於被聚合項目的地址,在上面的示例中就表示子模塊projectB是處在被聚合項目的子目錄下,即與被聚合項目的pom.xml處於同一目錄。這裏使用的module值是子模塊projectB對應的目錄名projectB,而不是子模塊對應的artifactId。這個時候當咱們對projectA進行mvn package命令時,實際上Maven也會對projectB進行打包。
那麼當被聚合項目與子模塊項目在目錄結構上不是父子關係的時候,咱們應該怎麼來進行聚合呢?仍是像繼承那樣使用relativePath元素嗎?答案是非也,具體作法是在module元素中指定以相對路徑的方式指定子模塊。咱們來看下面一個例子。
繼續使用上面的projectA和projectB,仍是須要把projectB聚合到projectA,可是projectA和projectB的目錄結構再也不是父子關係,而是以下所示的這種關係:
------projectA
------pom.xml
------projectB
------pom.xml
這個時候projectA的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../projectB</module>
</modules>
</project>
注意看module的值是「../projectB」,咱們知道「..」是表明當前目錄的上層目錄,因此它表示子模塊projectB是被聚合項目projectA的pom.xml文件所在目錄(即projectA)的上層目錄下面的子目錄,即與projectA處於同一目錄層次。注意,這裏的projectB對應的是projectB這個項目的目錄名稱,而不是它的artifactId。
假設有這樣一種狀況,有兩個項目,projectA和projectB,如今咱們須要projectB繼承projectA,同時須要把projectB聚合到projectA。而後projectA和projectB的目錄結構以下:
------projectA
------pom.xml
------projectB
------pom.xml
那麼這個時候按照上面說的那樣,projectA的pom.xml中須要定義它的packaging爲pom,須要定義它的modules,因此projectA的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../projectB</module>
</modules>
</project>
而projectB是繼承自projectA的,因此咱們須要在projectB的pom.xml文件中新增一個parent元素,用以定義它繼承的項目信息。因此projectB的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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../projectA/pom.xml</relativePath>
</parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
項目之間的依賴是經過pom.xml文件裏面的dependencies元素下面的dependency元素進行的。一個dependency元素定義一個依賴關係。在dependency元素中咱們主要經過依賴項目的groupId、artifactId和version來定義所依賴的項目。
先來看一個簡單的項目依賴的示例吧,假設我如今有一個項目projectA,而後它裏面有對junit的依賴,那麼它的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
groupId, artifactId, version:描述了依賴的項目惟一標誌。
type:對應於依賴項目的packaging類型,默認是jar。
scope:用於限制相應的依賴範圍、傳播範圍。scope的主要取值範圍以下(還有一個是在Maven2.0.9之後版本才支持的import,關於import做用域將在後文《Dependency介紹》中作介紹):
provided:這個跟compile很相似,可是它表示你指望這個依賴項目在運行時由JDK或者容器來提供。這種類型表示該依賴只有在測試和編譯的狀況下才有效,在運行時將由JDK或者容器提供。這種類型的依賴性是不可傳遞的。好比 javaee:
<dependencies> <dependency> <groupId>com.tiantian.mavenTest</groupId> <artifactId>projectB</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>com.tiantian.mavenTest</groupId> <artifactId>projectC</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
在pom.xml文件中咱們可使用${propertyName}的形式引用屬性。是值的佔位符,相似EL,相似ant的屬性,好比${X},可用於pom文件任何賦值的位置。有如下分類:
本文轉自:234390216
本文出自:藝意