1. 程式人生 > 實用技巧 >Maven 基礎知識(一)工程結構

Maven 基礎知識(一)工程結構

maven工程結構分為繼承和集合,通過繼承可以讓多個子模組共享配置在父模組中的配置資訊,通過集合可以讓我們在父模組執行命令時,遞迴的對子模組進行相同的處理。

下面以模組com.mycompany.app:my-app:1

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

和模組com.mycompany.app:my-module:1為例來進行說明

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>
	
  1. 繼承,通過在子模組中指定 <parent>元素來實現

    1. 場景1:子模組所在的目錄是父模組的子目錄

      .
       |-- my-module
       |   `-- pom.xml
       `-- pom.xml
      
      
      • 其中my-module/pom.xmlcom.mycompany.app:my-module:1的POM,pom.xmlcom.mycompany.app:my-app:1的POM

      為了把my-app變成my-module的父模組,可按如下修改my-module/pom.xml

      <project>
        <modelVersion>4.0.0</modelVersion>
       
        <parent>
          <groupId>com.mycompany.app</groupId>
          <artifactId>my-app</artifactId>
          <version>1</version>
        </parent>
       
        <artifactId>my-module</artifactId>
      </project>
      
      
      • 在子模組中追加了<parent>元素
      • 去除了my-module/pom.xml中的<groupId><version>,預設使用從父模組繼承到的屬性值
    2. 場景2: 子模組所在目錄不是父模組的子目錄

       |-- my-module
       |   `-- pom.xml
       `-- parent
           `-- pom.xml
      
      
      • 其中parent/pom.xmlcom.mycompany.app:my-app:1的POM,這個例子也告訴我們工程目錄名parentartifactId的值可以不一樣,但在實際應用中,我們一般會保持目錄名和artifactId一致,這裡只是為了說明my-app是父模組

      為了把my-app變成my-module的父模組,可按如下修改my-module/pom.xml

      <project>
        <modelVersion>4.0.0</modelVersion>
       
        <parent>
          <groupId>com.mycompany.app</groupId>
          <artifactId>my-app</artifactId>
          <version>1</version>
          <relativePath>../parent/pom.xml</relativePath>
        </parent>
       
        <artifactId>my-module</artifactId>
      </project>
      
      
      • <parent>元素中追加<relativePath>,相對路徑的起始目錄是當前子模組的路徑

    通過繼承,子模組可以從父模組繼承到如下元素

    groupId  
    version
    description
    url
    inceptionYear
    organization
    licenses
    developers
    contributors
    mailingLists
    scm
    issueManagement
    ciManagement
    properties
    dependencyManagement
    dependencies
    repositories
    pluginRepositories
    build
    	plugin executions with matching ids
    	plugin configuration
    	etc.
    reporting
    profiles
    
    
  2. 聚集,通過在父模組中指定<modules>

    一個模組設定到父模組的<modules>後,當在父模組執行maven命令時,將在所有子模組中遞迴執行

    通過以下兩步可以將子模組聚集到父模組中

    • 將父模組pom.xml中的<packaging>屬性值設定成pom
    • 在父模組中的<modules>元素中指定子模組的路徑
    1. 場景1:子模組所在的目錄是父模組的子目錄

      .
       |-- my-module
       |   `-- pom.xml
       `-- pom.xml
      
      
      • 其中my-module/pom.xmlcom.mycompany.app:my-module:1的POM,pom.xmlcom.mycompany.app:my-app:1的POM

      為了把my-module聚集到my-app模組下,可按如下修改my-app/pom.xml檔案

      <project>
        <modelVersion>4.0.0</modelVersion>
       
        <groupId>com.mycompany.app</groupId>
        <artifactId>my-app</artifactId>
        <version>1</version>
        <packaging>pom</packaging>
       
        <modules>
          <module>my-module</module>
        </modules>
      </project>
      
      
      • 追加<packaging>pom</packaging>,預設是jar
      • 追加<modules>,其中<module>中指定子模組的目錄位置,是一個相對路徑,起始路徑是父模組的目錄
    2. 場景2:子模組所在的目錄不是父模組的子目錄

      .
       |-- my-module
       |   `-- pom.xml
       `-- parent
           `-- pom.xml
      
      • 其中parent/pom.xmlcom.mycompany.app:my-app:1的POM

      通過相對路徑把把my-module聚集到my-app模組下

      <project>
        <modelVersion>4.0.0</modelVersion>
       
        <groupId>com.mycompany.app</groupId>
        <artifactId>my-app</artifactId>
        <version>1</version>
        <packaging>pom</packaging>
       
        <modules>
          <module>../my-module</module>
        </modules>
      </project>
      
      
  3. 繼承 VS 聚集

    當有多個maven工程,如果想實現所有工程共享一些配置資訊,可以採用 繼承 的模式,把公共資訊配置到一個工程裡,再把其他的工程中的<parent>指向這個工程。

    如果想實現對一批maven工程,同時進行編譯、釋出等操作,可以採用 聚集 的模式,建立一個parent工程,把這一批工程都作為parent工程的<modules>,這樣我們對父工程進行操作時,就可以遞迴的對所有module進行處理。

    當然我們也可以同時使用繼承 聚集,即在子模組中指定<parent>,同時也在父模組中指定<modules>

    按如下模組路徑舉例:

    .
     |-- my-module
     |   `-- pom.xml
     `-- parent
         `-- pom.xml
    
    
    • my-module/pom.xmlcom.mycompany.app:my-module:1的POM
    • parent/pom.xmlcom.mycompany.app:my-app:1的POM

    此時,為了同時利用繼承和聚集,可做如下修改

    com.mycompany.app:my-app:1的POM

    <project>
      <modelVersion>4.0.0</modelVersion>
     
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1</version>
      <packaging>pom</packaging>
     
      <modules>
        <module>../my-module</module>
      </modules>
    </project>
    
    

    com.mycompany.app:my-module:1的POM

    <project>
      <modelVersion>4.0.0</modelVersion>
     
      <parent>
        <groupId>com.mycompany.app</groupId>
        <artifactId>my-app</artifactId>
        <version>1</version>
        <relativePath>../parent/pom.xml</relativePath>
      </parent>
     
      <artifactId>my-module</artifactId>
    </project>