5.Maven项目的聚合与继承

1.maven项目的聚合

在实际工作中,maven项目一般都分成好几个maven模块,我们来模拟这个实现。在eclipse中分别建立三个maven project,下面先来看一下建完后的项目结构。
这里写图片描述
这三个模块,dao依赖domain, service依赖dao和domain。看一下service模块的pom代码:

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jackie.maventest</groupId>
  <artifactId>maventest-service</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>maventest-service</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
      <!--dao依赖-->
     <dependency>
      <groupId>com.jackie.maventest</groupId>
      <artifactId>maventest-dao</artifactId>
      <version>0.0.1-SNAPSHOT</version>
     </dependency>

   <!--domain依赖-->
     <dependency>
      <groupId>com.jackie.maventest</groupId>
      <artifactId>maventest-domain</artifactId>
      <version>0.0.1-SNAPSHOT</version>
     </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

现在有三个项目,要一次性构建三个项目,而不是分别到两个项目的目录下分别执行mvn命令,那么Maven的聚合就是为该需求服务的。下面来看maven的聚合的用法。
新建一个新的maven项目,这个项目中只要一个pom文件就可以了,如图:
这里写图片描述
再来看pom文件的代码:

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jackie.maventest</groupId>
  <artifactId>maventest-aggregation</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>maventest-aggregation</name>
  <url>http://maven.apache.org</url>

  <modules>
    <module>../maventest-domain</module>
    <module>../maventest-dao</module>
    <module>../maventest-service</module>
  </modules>    

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

</project>

可以看到,该文件的标签的值是pom,这个是必须的。再一个,中的路径问题:因为目前我们4个项目(一个聚合项目,三个普通项目)在同一个目录下,是一个级别,所以配置如上面代码。 这个配置原则是:以当前pom为根去查找其他项目的pom文件。平时也经常看到聚合项目是父目录,其他项目为子目录的情况,我们看一下项目结构:
这里写图片描述
这个结构下,pom文件中的配置如下:

  <modules>
    <module>maventest-domain</module>
    <module>maventest-dao</module>
    <module>maventest-service</module>
  </modules>

2.maven项目的继承

2.1继承

分析上面项目的代码,我们发现,maventest-dao、maventest-service都依赖maventest-domain,并且这三个模块都依赖junit,各个pom文件都存在重复配置,maven通过继承消除重复配置。类似于面向对象设计中的父子机构。我们新建项目,结构如下:
这里写图片描述
其中,maventest-parent项目是父项目。来看一下pom文件:

    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.jackie.maventest</groupId>
    <artifactId>maventest-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!--必须是pom-->
    <packaging>pom</packaging>
    <name>maventest parent</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

再来看一下子项目maventest-service的配置:

    <modelVersion>4.0.0</modelVersion>
    <artifactId>maventest-service</artifactId>
    <name>maventest-service</name>
    <url>http://maven.apache.org</url>

    <parent>
        <groupId>cn.jackie.maventest</groupId>
        <artifactId>maventest-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

</project>

可以看到,在这个配置文件中,已经没有了依赖的配置,都已经从父项目中继承了下来。刷新项目目录树,可以看到确实已经继承下来。
这里写图片描述

2.2继承管理

上面的依赖管理存在一个问题,父项目配置了所有的依赖,子项目继承了父项目的依赖,但是子项目不需要父类的所有依赖,也许只用其中的一个或者几个,怎么办?Maven提供了依赖管理,我们来改造父项目的pom配置:省略了xml头。

    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.jackie.maventest</groupId>
    <artifactId>maventest-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <packaging>pom</packaging>
    <name>maventest parent</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.0.8</version>
            </dependency>           
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.1.3</version>
            </dependency>
            <dependency>
                <groupId>cn.jackie.maventest</groupId>
                <artifactId>maventest-domain</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>

            <dependency>
                <groupId>cn.jackie.maventest</groupId>
                <artifactId>maventest-dao</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>18.0</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

父项目这样配置后,父项目不会引入实际的依赖,子项目在配置依赖时不用配置,因为该标签在父项目的pom中已经配置了。其中dao项目的pom配置文件如下:

    <artifactId>maventest-dao</artifactId>
    <name>maventest-dao</name>
    <url>http://maven.apache.org</url>

    <parent>
        <groupId>cn.jackie.maventest</groupId>
        <artifactId>maventest-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <dependencies>
        <dependency>
            <groupId>cn.jackie.maventest</groupId>
            <artifactId>maventest-domain</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
</project>

可见,子项目的配置简单了很多,从父项目的pom继承下来的标签有、等。最主要的是,在依赖管理配置时,不用再配置版本信息。

实际应用中,将聚合和继承配置在一起,子项目配置不变,父项目的配置如下:省略了头和一些依赖的配置。

    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.jackie.maventest</groupId>
    <artifactId>maventest-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <packaging>pom</packaging>
    <name>maventest parent</name>
    <url>http://maven.apache.org</url>

    <modules>
        <module>maventest-domain</module>
        <module>maventest-dao</module>
        <module>maventest-service</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            ...

完整代码请查看:https://github.com/maodou95838/basicMaven

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值