Maven實踐(十二)---POM參考指南

什麼是POM?

POM代表“項目對象模型”。 它是一個名爲pom.xml文件的Maven項目的XML表示形式。 在使用Maven的人面前,說到一個項目是在哲學意義上說的,不僅僅只是收集包含代碼的文件。 一個項目包含配置文件,以及所涉及的開發人員所扮演的角色、缺陷跟蹤系統、組織和許可證,項目的URL、項目的依賴關係以及所有其他包含在代碼生命週期中的部分。 這是一個關於項目的一站式解決方案。 事實上,在Maven世界中,項目根本不需要包含任何代碼,只是一個pom.xml。

概述

這是POM項目下的元素列表。請注意,modelVersion包含4.0.0。這是目前唯一支持Maven 2和3的POM版本,並且始終是必需的。

<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包含有關項目的所有必要信息,以及在構建過程中要使用的插件的配置。 它實際上是“誰”,“什麼”和“哪裏”的表現,而構建生命週期是“何時”和“如何”。 這並不是說POM不會影響生命週期的流動。 例如,通過配置maven-antrun-plugin,可以在POM中有效地嵌入ant task, 這是一個聲明。 build.xml會在運行(程序)時精確地告訴ant task 何時何地做什麼,POM會聲明其配置(聲明式)。 如果一些外部力量導致生命週期跳過ant插件執行,它將不會停止執行的插件做他們的工作。 這與build.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>org.codehaus.mojo</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>

Maven座標

上面定義的POM是Maven 2和3將允許的最小值。 groupId:artifactId:version都是必需的字段(儘管如果從父進程繼承,則不需要明確定義groupId和version)。 這三個字段的行爲非常類似於地址和時間戳。 這標誌着存儲庫中的一個特定位置,像Maven項目的座標系一樣。

  • groupId:這在組織或項目中通常是獨一無二的。例如,所有核心的Maven工件(應該)應該在groupId
    org.apache.maven下生成。組ID不一定使用點符號,例如junit項目。請注意,點注意的groupId不必與項目包含的包​​結構對應。然而,這是一個很好的做法。當存儲在存儲庫中時,該組的作用與操作系統中的Java包裝結構非常相似。這些點由操作系統特定的目錄分隔符(例如Unix中的“/”)替換,從基礎存儲庫成爲相對目錄結構。在給出的示例中,org.codehaus.mojo組存在於$M2_REPO / org / codehaus / mojo目錄中。
  • artifactId:artifactId通常是該項目被稱爲的名稱。雖然groupId很重要,但羣組中的人很少會提及討論中的groupId(它們通常都是相同的ID,例如Codehaus Mojo項目groupId:org.codehaus.mojo)。它與groupId一起創建一個將該項目與世界上其他項目分開的鍵(至少應該是:))。除了groupId,artifactId完全定義了倉庫中的工件的生存區。在上述項目的情況下,我的項目生活在$M2_REPO / org / codehaus / mojo / my-project中。
  • version:這是命名拼圖的最後一塊。groupId:artifactId表示單個項目,但它們不能描述我們正在討論的該項目的化身。我們想要今天的junit:junit(版本4)還是四年前(版本2)?簡而言之:代碼更改,這些更改應該進行版本控制,並且該元素將這些版本保持一致。它也用於工件存儲庫中以將版本彼此分離。我的項目版本1.0文件存在於目錄結構$M2_REPO / org / codehaus / mojo / my-project / 1.0中。

    上面提到的三個要素指向一個項目的特定版本,讓Maven知道我們正在處理的是什麼,並且在其軟件生命週期中我們想要它們。

  • packaging:現在我們有我們的地址結構groupId:artifactId:version,還有一個標準的標籤給我們一個真正完整的地址。這就是項目的工件類型。在我們的例子中,上面定義的org.codehaus.mojo:my-project:1.0的例子POM將被打包成jar。我們可以通過宣佈不同的包裝使之成爲一個war文件:

<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">
  ...
  <packaging>war</packaging>
  ...
</project>

當沒有聲packaging,Maven假設工件是默認值:jar。 有效的類型是組件角色
org.apache.maven.lifecycle.mapping.LifecycleMapping的Plexus角色提示(有關Plexus的更多信息,瞭解角色和角色提示的說明)。 目前的核心包裝價值是:pom,jar,maven-plugin,ejb,war,ear,rar,par。 這些定義了針對特定包結構執行到每個相應構建生命週期階段的默認目標列表。

您有時會看到Maven打印出一個項目座標爲groupId:artifactId:packaging:version。

  • classfier:您可能偶爾在座標上找到第五個元素,也就是classifier。 我們稍後會訪問classifier,但現在只需知道這些項目就顯示爲groupId:artifactId:packaging:classifier:version。

POM關係

Maven的一個強大方面是處理項目關係; 其中包括依賴關係(和傳遞依賴項),繼承和聚合(多模塊項目)。 依賴管理有一個很長的傳統,是一個複雜的混亂,只是最微不足道的項目。 隨着依賴關係樹變大而複雜,“Jarmageddon”迅速發生。 “Jar Hell”如下,其中一個系統上的依賴關係的版本不等同於通過錯誤的版本給出的版本,或者類似命名的jar之間的衝突版本。 Maven通過通用的本地存儲庫來解決這兩個問題,從而正確鏈接項目,版本和所有。

Dependencies

POM的基石是其依賴列表。 大多數項目都取決於他人建立和運行正確,如果所有的Maven都爲您管理這個列表,您就獲得了很多。 Maven下載並鏈接您的依賴關係,編譯和其他需要它們的目標。 作爲一個額外的好處,Maven引入了這些依賴關係(傳遞性依賴)的依賴,允許您的列表僅專注於項目所需的依賴關係。

<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
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.0</version>
      <type>jar</type>
      <scope>test</scope>
      <optional>true</optional>
    </dependency>
    ...
  </dependencies>
  ...
</project>

groupId,artifactId,version:
你會經常看到這些元素。該三位一體用於及時計算具體項目的Maven座標,將其作爲該項目的依賴關係。此計算的目的是選擇一個與所有依賴關係聲明相匹配的版本(由於傳遞性依賴關係,同一組件可能有多個依賴關係聲明)。值應該是:

  • groupId,artifactId:直接依賴相應的座標
  • version:依賴關係版本要求規範,用於計算依賴關係的有效版本

由於依賴關係是由Maven座標描述的,所以您可能會想:“這意味着我的項目只能依賴於Maven組件!”答案是,“當然,但這是件好事。”這迫使您完全依賴於Maven可以管理的依賴關係。有時候,不幸的是,當一個項目無法從Maven中央庫中下載時。例如,項目可能依賴於具有封閉源許可證的jar,該jar禁止它在中央存儲庫中。處理這種情況有三種方法。

1、 使用安裝插件本地安裝依賴關係。 該方法是最簡單的推薦方法。 例如:

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId = some.group -DartifactId =non-maven-proj -Dversion = 1 -Dpackaging = jar

請注意,仍然需要一個地址,只有這一次您使用命令行,安裝插件將爲您創建一個給定地址的POM

2、創建自己的存儲庫並將其部署在那裏。 這對於擁有內部網的公司來說是一個最受歡迎的方法,需要使每個人都能同步。有一個名爲deploy:deploy-file的Maven目標類似於install:install-file目標

3、將依賴關係範圍設置爲系統並定義systemPath。 但是不建議這樣做

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章