1. 程式人生 > 實用技巧 >pom.xml詳解

pom.xml詳解

POM(Project Object Model)是Maven工程的工作基礎,以pom.xml的形式存在專案中。在我們的工程中有幾個元素是必須的:

  • project root
  • modelVersion - 應被設定為4.0.0
  • groupId - 專案組id
  • artifactId - 專案id
  • version - 專案版本

假設你有一個專案com.mycompany.app:my-app:1.0專案結構如下:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1.0</version>
</project>

如果我們想要my-module繼承上級工程的pom配置,則可將pom.xml改為如下:

<project>
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1.0</version>
</project>

此外,如果我們希望工程的groupId跟version保持與父工程一致,則可去掉 groupId和version:


<project>
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-module</artifactId>
</project>

下面就以一個比較完整pom.xml檔案為例說明一下:

<project>
  <parent>
    <!--被繼承的父專案的全球唯一識別符號-->
    <groupId>com.mycompany.app</groupId>
    <!--被繼承的父專案的構件識別符號-->
    <artifactId>my-app</artifactId>
    <!--專案當前版本,格式為:主版本.次版本.增量版本-限定版本號-->
    <version>1.0</version>
  </parent>
  <!--宣告專案描述符遵循哪一個POM模型版本。模型本身的版本很少改變,雖然如此,但它仍然是必不可少的,這是為了當Maven引入了新的特性或者其他模型變更的時候,確保穩定性。--> 
  <modelVersion>4.0.0</modelVersion>
  <!--專案的全球唯一識別符號,通常使用全限定的包名區分該專案和其他專案。並且構建時生成的路徑也是由此生成, 如com.mycompany.app生成的相對路徑為:/com/mycompany/app--> 
  <groupId>com.mycompany.app</groupId>
  <!--構件的識別符號,它和group ID一起唯一標識一個構件。換句話說,你不能有兩個不同的專案擁有同樣的artifact ID和groupID;在某個特定的group ID下,artifact ID也必須是唯一的。構件是專案產生的或使用的一個東西,Maven為專案產生的構件包括:JARs,原始碼,二進位制釋出和WARs等。-->  
  <artifactId>my-module</artifactId>   
  <!--專案當前版本,格式為:主版本.次版本.增量版本-限定版本號-->
  <version>1.0</version>
  <!--專案產生的構件型別,例如jar、war、ear、pom。外掛可以建立他們自己的構件型別,所以前面列的不是全部構件型別-->  
  <packaging>jar</packaging>
  <!--專案當前版本,格式為:主版本.次版本.增量版本-限定版本號-->  
  <!--(1表示大版本號,0表示小版本號)SNAPSHOT:快照,表示該版本正在開發中/release:穩定版本/beta:公測版/alpha:內部測試版/GA:正式釋出版-->
  <version>1.0-SNAPSHOT</version>  
  <!--專案的名稱, Maven產生的文件用-->  
  <name>專案名稱</name>  
  <!--專案主頁的URL, Maven產生的文件用-->  
  <url>專案主頁URL</url>  
  <!--專案的詳細描述,Maven產生的文件用。當這個元素能夠用HTML格式描述時(例如,CDATA中的文字會被解析器忽略,就可以包含HTML標籤), 不鼓勵使用純文字描述。如果你需要修改產生的web站點的索引頁面,你應該修改你自己的索引頁檔案,而不是調整這裡的文件。-->  
  <description>Maven工程的描述資訊</description>   
  <!--開發人員的列表資訊-->
  <developers>
    <developer>
      <name>開發者1</name>
      <!--等其他填寫的資訊-->
    </developer>
    <developer>
      <name>開發者2</name>
      <!--等其他填寫的資訊-->
    </developer>
  </developers>
  <!--許可證資訊-->
  <licenses></licenses>
  <!--組織資訊-->
  <organization></organization>
  <!--依賴項資訊,依賴到的jar包-->
  <dependencies>
    <!--第一個依賴jar-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <type></type>
      <!--依賴的範圍,表示本依賴應用於專案中的哪些階段如下:
            compile:預設值。表示該依賴在編譯、測試、執行階段都有效
            provided:在編譯和測試時有效,在執行時不會被加入
            runtime:在測試和執行時有效
            test:在測試範圍內有效
            system:在編譯和測試時有效,與provided類似,不過要與本地系統相關聯,可移植性差
            import:在dependenceManagement中使用,表示匯入別的專案的依賴到本專案中-->
      <scope>test</scope>
      <!--設定依賴是否可選,取值為true或false,預設是false,如果是false,則子專案必然繼承父專案的依賴(不可選),若為true,則子專案可以自己選擇是否需要父專案的依賴,若需要就手動引入,若不需要就不引入-->
      <optional>true</optional>
      <!--排除依賴列表,如果a依賴b,b依賴c,那麼預設的a依賴c,但是我a就是不想依賴c,則可以在這裡排除掉c-->
      <exclusions>
        <exclusion></exclusion>
      </exclusions>
    </dependency>
    <!--第二個依賴jar-->
    <dependency>
      <!--....-->      
    </dependency>
  </dependencies>
  <!--一般為了統一管理多個專案,讓他們的依賴都具有相同的版本,在所有子模組中的依賴標籤都不指定明確的版本號,maven會自動向其父級查詢,直到找到一個父模組擁有dependencyManagement標籤,指定了所有依賴的版本號。這就保證所有模組的依賴版本都來自於同一個父模組的dependencyManagement指定。-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        </dependency>
    </dependencies>
  </dependencyManagement>
  <!--外掛對構建專案的支援-->
  <build>
    <!--外掛-->
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.6</version>
        <!--表示該外掛在什麼時候執行-->
        <executions>
          <execution>
          <!--表示在打包階段之後執行本外掛-->
          <phase>package</phase>
          <!--執行方式,一般是與java的啟動引數類似,例如:run等-->
          <goals>
            <goal>jar-no-fork</goal>
          </goals>
          </execution>
        </executions>
       </plugin>
    </plugins>
  </build>
  <!--多模組共同管理,一起編譯-->
  <modules>
    <module>A</module>
    <module>B</module>
    <module>C</module>
  </modules>
  <!--屬性,可以指定變數,如下所示-->
    <properties>
        <!--變數名稱自己定義,獲取變數值使用:${變數名稱} -->
        <junit.version>4.10</junit.version>
    </properties>
</project>