Loading

Maven基础2

Maven的父子工程(继承)及聚合(多模块)

maven的父子工程(继承):

继承是 Maven 中很强大的一种功能,继承是为了抽取多个模块的公共配置,以实现统一/简化配置的目的。

父 POM 中的大多数元素都能被子 POM 继承。除了以下元素外,其它元素均可被子模块继承:

  • artifactId
  • prerequisites
  • name

继承可以有效的避免多个子模块使用依赖版本不一致的情况, 有助于降低依赖冲突的几率.
父 pom 中的大多数元素都能被子 pom 继承, 在简化 pom 的同时, 还能够促进各个模块配置的一致性。

依赖的继承

  1. 父项目中定义 <dependencies>,子项目直接继承了父项目的 ,从而不再需要引入这些依赖。

  2. 在 父 pom 中 <dependencyManagement>标签配置的依赖既不会给它的子模块引入依赖,仅仅表示它的配置是可继承的。子项目一旦使用,则无需指定它们的版本信息!

关于<dependencyManagement>用法

  1. 父pom.xml声明依赖:
<dependencyManagement>
           <dependencies>
                <dependency><!-- 定义可能会使用的依赖 -->
                     <groupId>org.codehaus.mojo</groupId>
                     <artifactId>my-parent</artifactId>
                     <version>2.0</version>
                </dependency>

                <dependecy>...</dependecy><!-- 定义可能会使用的依赖 -->
                <dependecy>...</dependecy><!-- 定义可能会使用的依赖 -->
           </dependencies>
     </dependencyManagement>
  1. 子项目引用依赖:

不需要定义版本号, 只用填写<groupId><artifactId>表示继承父项目的声明,
否则 maven 是不会加载父模块中声明的声明。

 <dependencies>
           <dependency>
                <groupId>org.codehaus.mojo</groupId> <!-- 引用父pom的声明 -->
                <artifactId>my-parent</artifactId>
                  ~~ <version>2.0</version> ~~  <!-- 不需要指定版本信息! -->
           </dependency>
     </dependencies>

简单理解:

简单来说,我们写两个不同的功能那么我们需要建两个不同的 Maven Project,那么我们需要配置两次 pom 文件,它们可能有大部分依赖是相同的,我们也要重复配置。如果功能更多呢?我们需要重复配置很多相同的东西,父子工程的出现就大大的简化了这些。我们抽取公共配置放在父项目,而子项目可以继承父项目的配置,这样大大简化了配置

父项目:

通常 Maven 的父项目是一个特殊项目,本质上,它是因为了复用配置而存在的项目,而并非一个实际意义上的真实的项目,因此父项目下完全不需要存在 java 包和 resources 包,父项目下只需要存在一个 pom.xml 文件即可。

  • 注意: 父项目的 package 类型是 pom 类型。

子项目:

注意: 子项目不一定非要在父项目里面,也可以和父项目是平级关系。

如何创建一个父子项目呢:

①正常创建一个Maven Project ,作为父项目。完成可去掉 java 和 resources。

②创建一个Maven Project,在它的pom文件中指明它的父项目是谁?使用parent元素,如下实例:

<!-- 指定它的父模块是谁 -->
     <parent>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>my-parent</artifactId>
        <version>2.0</version>
        <relativePath></relativePath>
    </parent>
    

<relativePath> 元素用于指明本项目(子项目)的父项目的 pom 文件的路径名。例如:

<!-- 对应写法,在硬盘上的目录层次结构中,子模块在父模块的『里面』。 -->
<relativePath>../pom.xml</relativePath>

<!-- 对应写法,在硬盘上的目录层次结构中,子模块和父模块『平级』。 -->
<relativePath>../parent-module/pom.xml</relativePath>

<!-- 对应写法,Maven 就不关心子模块和父模块在硬盘上的目录层次结构,它要求父模块在本地仓库中存在 -->
<relativePath />
  • 如果完全没有<relativePath>元素,等同于:../pom.xml

  • 注意: 子项目不一定非得新建在父项目内。所以,默认的 ../pom.xml 并一定总是对的。

Maven聚合

Maven 聚合 功能是 继承 功能的『升级』。

即,Maven 多模块项目一定是父子项目,Maven 父子项目则不一定是多模块项目。

  • Maven 继承(父子工程)的目的为了配置文件的复用和配置信息的统一管理。
  • Maven 聚合(多模块工程)目的是项目功能上的拆分。

由于 Maven 多模块项目是父子项目的一种高级形式,因此,多模块项目也是有一个父模块包含一个或多个子模块,不过有几点不同:

  • 多模块项目中,子项目一定是在父项目『里面』的。

  • 多模块项目中,父项目中会『多出来』一个 <modules>元素。

<modules>
    <module>modele1-service</module> <!--指定的子项目1-->
    <module>modele2-web</module> <!--指定的子项目2-->
    <module>bbb</module> <!--指定的子项目3-->
  </modules>

如何安装运行maven聚合项目?

在父模块的pom.xml中添加tomcat7的插件,然后正常的运行即可。tomcat7插件不要放在子模块的pom.xml身上,如果要放子模块上也只能放web模块身上。

而上面这几个模块都需要安装发布到本地仓库才能正常运行,如果这些模块有任何变化都需要重新安装发布到本地仓库才能生效。建议放在父模块的pom文件中,不容易出错!

posted @ 2019-10-26 21:26  Helen's  阅读(154)  评论(0编辑  收藏  举报