maven多模块和继承

maven具有多模块聚合功能,即可以以父子关系体现模块间的关系,并关联各模块。

 

首先介绍一下具有继承依赖关系模块(多个模块不仅与公共模块关联,彼此间也存在相互依赖的关系)。

父模块的定义:

1.packaging必须是pom类型

2.modules部分声明子模块

3.properties部分声明公用变量,可被直接继承
4.dependencies部分是公用的依赖,可被直接继承

5.dependencyManagement部分用于管理依赖,被dependencyManagement配置的元素既不会引入父项目的依赖,也不会给子项目引入依赖,只是表示该部分是可被继承的,但不直接被引用。如果需要引用dependencyManagement部分内容,只需申明groupId和artifactId即可,不需要版本号。maven或自动继承dependencyManagement中相同名称的依赖。

6.repositoties是用来定义私服仓库的。

7.distributionManagement是用来将打包后的项目发布到私服上的。

 

下面的例子定义了一个iscp_esb_components父项目,其中包括了iscp_esp_components_web和iscp_esb_components_dqms 2个模块,iscp_esp_components_web依赖于iscp_esb_components_dqms模块。

 

  1.  
    <modelVersion>4.0.0</modelVersion>
  2.  
    <groupId>com.dhcc.iscp.components</groupId>
  3.  
    <packaging>pom</packaging>
  4.  
    <artifactId>iscp_esb_components</artifactId>
  5.  
    <version>2.1.0</version>
  6.  
    <name>iscp_esb_components</name>
  7.  
    <modules>
  8.  
    <module>iscp_esb_components_web</module>
  9.  
    <module>iscp_esb_components_dqms</module>
  10.  
    </modules>
  11.  
    <properties>
  12.  
    <package.environment>src/main/resources</package.environment>
  13.  
    <struts2.version>2.3.16.3</struts2.version>
  14.  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15.  
    </properties>
  16.  
    <dependencies>
  17.  
    <dependency>
  18.  
    <groupId>org.springframework</groupId>
  19.  
    <artifactId>spring-orm</artifactId>
  20.  
    </dependency>
  21.  
    <dependency>
  22.  
    <groupId>org.springframework</groupId>
  23.  
    <artifactId>spring-aop</artifactId>
  24.  
    </dependency>
  25.  
    </dependencies>
  26.  
    <dependencyManagement>
  27.  
    <dependencies>
  28.  
    <dependency>
  29.  
    <groupId>org.springframework</groupId>
  30.  
    <artifactId>spring-beans</artifactId>
  31.  
    <version>${spring.version}</version>
  32.  
    </dependency>
  33.  
    <dependency>
  34.  
    <groupId>org.springframework</groupId>
  35.  
    <artifactId>spring-context</artifactId>
  36.  
    <version>${spring.version}</version>
  37.  
    </dependency>
  38.  
    <dependency>
  39.  
    <groupId>org.springframework</groupId>
  40.  
    <artifactId>spring-core</artifactId>
  41.  
    <version>${spring.version}</version>
  42.  
    </dependency>
  43.  
    </dependencies>
  44.  
    </dependencyManagement>
  45.  
     
  46.  
    <repositories>
  47.  
    <repository>
  48.  
    <id>mvn-repo</id>
  49.  
    <url>http://maven.ansj.org/</url>
  50.  
    </repository>
  51.  
    </repositories>
  52.  
    <!-- deploy到私服 -->
  53.  
    <distributionManagement>
  54.  
    <repository>
  55.  
    <id>releases</id>
  56.  
    <name>dhcc_releases</name>
  57.  
    <url>http://113.140.81.70:8081/nexus/content/repositories/dhcc_releases/</url>
  58.  
    </repository>
  59.  
    <snapshotRepository>
  60.  
    <id>Snapshots</id>
  61.  
    <name>dhcc_snapshots</name>
  62.  
    <url>http://113.140.81.70:8081/nexus/content/repositories/dhcc_snapshots/</url>
  63.  
    </snapshotRepository>
  64.  
    </distributionManagement>

 

子模块定义

parent部分声明父模块

dependencies部分添加iscp_esb_components_dqms模块的依赖

 

iscp_esb_components_web模块定义

 

  1.  
    <parent>
  2.  
    <groupId>com.dhcc.iscp.components</groupId>
  3.  
    <artifactId>iscp_esb_components</artifactId>
  4.  
    <version>2.1.0</version>
  5.  
    </parent>
  6.  
    <groupId>com.dhcc.iscp.components.web</groupId>
  7.  
    <artifactId>iscp_esb_components_web</artifactId>
  8.  
    <version>2.1.0</version>
  9.  
    <packaging>war</packaging>
  10.  
    <name>iscp_components_web</name>
  11.  
    <dependencies>
  12.  
    <dependency>
  13.  
    <groupId>com.dhcc.iscp.components</groupId>
  14.  
    <artifactId>iscp_esb_components_dqms</artifactId>
  15.  
    <version>2.1.0</version>
  16.  
    </dependency>
  17.  
    </dependencies>
  18.  
     
  19.  
    <build>
  20.  
    <finalName>iscp_components_web</finalName>
  21.  
    <sourceDirectory>src/main/java</sourceDirectory>
  22.  
    <resources>
  23.  
    <resource>
  24.  
    <directory>src/main/resources</directory>
  25.  
    </resource>
  26.  
    <resource>
  27.  
    <directory>src/main/baseResources</directory>
  28.  
    </resource>
  29.  
    </resources>
  30.  
    <testResources>
  31.  
    <testResource>
  32.  
    <directory>src/test/resources</directory>
  33.  
    </testResource>
  34.  
    </testResources>
  35.  
     
  36.  
    <plugins>
  37.  
    <plugin>
  38.  
    <groupId>org.apache.maven.plugins</groupId>
  39.  
    <artifactId>maven-compiler-plugin</artifactId>
  40.  
    <version>2.0.2</version>
  41.  
    <configuration>
  42.  
    <source>1.7</source>
  43.  
    <target>1.7</target>
  44.  
    <encoding>UTF-8</encoding>
  45.  
    </configuration>
  46.  
    </plugin>
  47.  
    <plugin>
  48.  
    <artifactId>maven-war-plugin</artifactId>
  49.  
    <version>2.1</version>
  50.  
    <configuration>
  51.  
    <webappDirectory>webContent</webappDirectory>
  52.  
    <failOnMissingWebXml>false</failOnMissingWebXml>
  53.  
    <packagingExcludes>
  54.  
    WEB-INF/lib/spring-2.5.**.jar,
  55.  
    WEB-INF/lib/javassist-3.11.0.GA.jar,
  56.  
    WEB-INF/lib/xml-apis-1.0.b2.jar,
  57.  
    WEB-INF/lib/jackson-core-asl-1.9.11.jar,
  58.  
    WEB-INF/lib/jackson-mapper-asl-1.9.11.jar,
  59.  
    WEB-INF/lib/c3p0-0.9.1.1.jar,
  60.  
    WEB-INF/lib/commons-fileupload-1.3.jar,
  61.  
    </packagingExcludes>
  62.  
    </configuration>
  63.  
    </plugin>
  64.  
    </plugins>
  65.  
    </build>




iscp_esb_components_dqms模块定义

1.不声明packaging,默认以jar形式打包。

2.不声明version,groupId默认继承父模块的version,groupId。

 

 

  1.  
    <span style="font-size:18px;"><parent>
  2.  
    <groupId>com.dhcc.iscp.components</groupId>
  3.  
    <artifactId>iscp_esb_components</artifactId>
  4.  
    <version>${iscp-components}</version>
  5.  
    </parent>
  6.  
    <artifactId>iscp_esb_components_dqms</artifactId>
  7.  
    <name>iscp_esb_components_dqms</name></span>



maven编译过程

对于这个项目,我们有2种编译方式。
第一种是直接maven clean install 父项目(iscp_esb_components)。maven会通过Reactor机制制定编译顺序,依次编译所有项目。在本例中maven会先编译iscp_esb_components项目,然后发现iscp_esb_components_web依赖于iscp_esb_components_dqms,所以会先编译iscp_esb_components_dqms,最后编译iscp_esb_components_web。

 

在父模块下编译,maven知道父模块下的所有子模块,并会按照依赖关系依次处理执行。

 

第二种是分别编译打包。即分别对个项目编译,但是这样做存在一个问题。当我们首先打包iscp_esb_components_web时,maven会发现iscp_esb_components_web依赖于iscp_esb_components_dqms,那么就会去本地仓库查找iscp_esb_components_dqms的jar,但是现在iscp_esb_components_dqms并未编译还没有jar,本地仓库还没有该jar,maven又去远程仓库查找,你也为将该jar发布到私服上,仍然找不到,那么就会报错,你需要去手动再编译iscp_esb_components_dqms。

 

编译maven子项目时,maven不仅对子项目编译执行,也编译执行了父项目,但不会编译兄弟项目及其兄弟项目的子项目。

 

不具有依赖关系的多模块项目

即兄弟项目间互不关联,都只与父项目存在依赖关系。

    对于这类型的项目,我们可以删除父模块的<modules>...</modules>部分,而子模块保留parent部分。此时项目不再是一个多模块项目,而是多工程项目的一个集合。

   以上例说明,去掉iscp_esb_components中的<modules>部分,那么编译iscp_esb_components时,只会编译iscp_esb_components本身,不会编译web和dqms模块。如果编译iscp_esb_components_web时,由于父子关系还存在,maven会先到仓库查找iscp_esb_components和iscp_esb_components_dqms依赖然后依次执行。

   此时发布web模块时需依次"maven clean install"  iscp_esb_components ——>iscp_esb_components_dqms——>iscp_esb_components_web。

   

  如果保留父模块的<modules>...</modules>部分而删除子模块的parent部分,那么项目不再是父子项目,只是一个多模块项目,每个子项目独享自己的资源,不能共享。

本文转载自:https://blog.csdn.net/mafan121/article/details/50477852

posted @ 2018-08-24 10:28  looyee  阅读(701)  评论(0编辑  收藏  举报