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>,相对路径的起始目录是当前子模块的路径
    3. 场景3: 父工程在镜像仓库中

      <project>
        <modelVersion>4.0.0</modelVersion>
       
        <parent>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-parent</artifactId>
      	<version>2.3.2.RELEASE</version>
      	<relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>my-module</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </project>
      
      

    通过继承,子模块可以从父模块继承到如下元素

    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>
    
    
posted @ 2020-11-28 21:45  高枫_henu  Views(201)  Comments(0Edit  收藏  举报