maven聚合和继承

上一篇文章学习了maven的依赖关系,并且使用maven和hibernate结合起来实现了一个简单的demo,可以看出使用maven来管理项目还是很方便的,再也不用手动的找需要的jar文件了,只需要手动的配置即可,可是大家有没有发现一个问题。

上一篇我们创建了两个工程,”user-core”,”user-dao”,但是在编译打包的时候是分别进行操作的,那么如果我有很多工程,每个工程单独来进行编译打包等操作是很麻烦的,不过可以使用maven的聚合技术进行简单的配置就可以完成这样的需求了。

maven聚合

  1. 首先创建一个user-total的工程
  2. 由于使用maven聚合只需要用到pom.xml文件中配置即可,所以删除没用的目录:”src/main/java”和”src/test/java”.
  3. 删除pom.xml中的所有依赖

    到目前为止,项目结构如下:

  4. 在pom.xml文件中使用modules标签来进行聚合,并且将打包方式改为pom

    pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.test.user</groupId>
  <artifactId>user-total</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>user-total</name>
  <url>http://maven.apache.org</url>

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

  <modules>
    <module>../user-core</module>
    <module>../user-dao</module>
  </modules>
</project>

可以看到这里我聚合了user-core和user-dao这两个模块,由于这里的module的值是需要聚合的模块的名称的值,使用 “..”是因为这两个模块在当前pom.xml文件的上层目录。

需要注意的是,聚合的时候需要将该pom.xml的packaging设置为pom

此时运行user-total的pom.xml文件,输入”clean install”命令就可以将这两个模块一起编译了。

maven继承

可以看到,如果我们的user-core和user-dao这两个模块中groupId和version以及其他很多的依赖是相同的,此时我们可以利用maven提供的继承来简化。

1. 新建user-parent工程。

2. 由于user-parent工程只是用来做继承用的因此,只需要保留pom.xml文件即可。

3. 修改user-parent工程的pom.xml的packaging标签的值为pom

user-parent的pom.xml:

此时就可以在user-core中继承自user-parent了,user-core的pom.xml

可以看到此时user-core的pom.xml却是精简了不少,凡是user-parent中存在的,在user-core中都不需要再重写了。

同时,还可以在parent工程中定义好某一个依赖的版本,version标签中引用即可,如下:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.10</junit.version>
</properties>
<dependencies>
    <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
    </dependency>
</dependencies>

存在的问题

但是,这样做会存在以下问题,目前我们只有一个user-core继承自user-parent,并且将其依赖的包加入到user-parent的pom.xml文件中,那么如果user-dao依赖的所有包也加入到user-parent中,此时这两个工程就被动的互相依赖自己没有的包,这样就会导致工程冗余。

比如:

user-core依赖如下的包:

junit,hibernate,mysql

user-dao依赖如下包:

junit,log4j

此时,如果我们将这些包都这样配置到user-parent的pom.xml文件中,那么user-core和user-dao都会依赖这些包。

不过maven为我们提拱了一个dependencyManagement标签用来解决该问题。在user-parent的pom.xml文件中声明所有子工程需要依赖的包。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>4.0.0.Final</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.1</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

此时user-core依赖如下包:

junit,hibernate,mysql

那么user-core的pom.xml文件中,只需要引入需要的依赖即可,并且不用写version了

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

user-dao依赖如下包:

junit,log4j

pom.xml:

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
    </dependencies>

聚合和继承

大家有没有发现,聚合和继承是很相似的,packaging都是pom类型,因此我们可以将聚合放入到继承中去,此时user-parent的pom.xml文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test.user</groupId>
    <artifactId>user-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>../user-core</module>
        <module>../user-dao</module>
    </modules>

    <name>user-parent</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.10</junit.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>4.0.0.Final</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.1</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

此时user-parent的pom.xml既有聚合功能,又有继承功能。

源码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 07:33:48

maven聚合和继承的相关文章

maven聚合与继承笔记

maven聚合 聚合的目的是为了快速构建项目,当我们有几个maven模块,想要一次性构建,而不是到每个模块下面去执行maven命令,这时候就需要使用maven聚合(或者称为多模块). 使用聚合的时候,我们需要新建一个maven项目,由它来控制构建其他的项目,其pom.xml配置与其他普通maven项目的区别主要在以下两个地方: 打包类型(packaging)必须为pom 需要在其中添加modules标签,在其中使用module标签包括需要同时构建的maven模块的名称路径,路径为相对于此pom.

maven聚合与继承

注意:聚合或继承的父工程必须打包为pom 定义: 聚合:将多个子模块聚合到一个父工程中(仅包含一个pom.xml) 继承:多个子模块可以继承自一个父工程(仅包含一个pom.xml) 作用: 聚合:方便统一管理,统一对父工程使用maven命令,所有子模块也会执行 继承:方便所有模块jar包版本的管理 相关代码: 聚合: <modules> <module>../user-dao</module> <module>../user-service</modu

6.Maven聚合和继承,相关案例配置

 1有时候一个项目中有很多个模块,要想各个模块之间影响较小,可以将每个模块拿出来作为一个项目模块,对每个项目模块进行独立的开发. 2在这些过程中会遇到关于聚合和继承的问题. 3何为聚合? A如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合,也就是说当我们点击一个pom的时候,同时运行多个项目模块.这时候要用到以下的标签,将各个项目模块整合在一起. <modules> <module>-</module> </modules> 4何为继承

Maven - 聚合与继承

1.聚合(aggregator) 所谓聚合,顾名思义.就是把多个模块或项目聚合到一起. 我们能够建立一个专门负责聚合工作的Maven project -  aggregator. 建立该project的时候.我们要注意下面几点: 1.该aggregator本身也做为一个Maven项目,它必须有自己的POM 2.它的打包方式必须为: packaging 3.引入了新的元素:modules---module 4.版本号:聚合模块的版本号和被聚合模块版本号一致 5.relative path:每一个m

Maven聚合模块与继承和Maven的生命周期

端碗吹水 Maven聚合模块: 因为Maven是提倡模块化编程的,所以会以多个工程分为多个模块.如果所有的功能.模块都写在一个工程里的话,不方便于扩展.升级.修改.查看和团队开发,而且也不方便于模块的复用. Maven则是提倡将一个项目拆分成多个工程,每个工程完成一个模块或功能,这些工程就像零件一般,分别去进行开发,分为多个工程也方便于维护和分工合作. 每个工程模块可以通过pom配置文件实现串联,例如配置好pom文件之后,A工程可以直接对B工程的代码进行调用,C工程可以对A和B工程的代码进行调用

Java-Maven(七):Eclipse中Maven依赖、聚合、继承特性

之前通过学习了解,maven集成到eclipse中的如何创建项目,以及maven命令插件在eclipse中安装后的用法.那么接下来我们将会学习一些maven在项目中的一些特性,及如何使用. Maven依赖特性 Maven聚合特性 Maven继承特性

Maven学习总结(五)——聚合与继承

一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module> 3 <module>模块二</module> 4 <module>模块三</module> 5 </modules> 例如:对项目的Hello.HelloFriend.MakeFriends这三个模块进行聚合 1 <modules>

Maven学习笔记(七):聚合与继承

软件设计人员往往会采用各种方式对软件划分模块,以得到更清晰的设计及更高的重用性.当把Maven应用到实际项目中的时候,也需要将项目分成不同模块.Maven的聚合特性能够把项目的各个模块聚合在一起构建,而Maven的继承特性则能帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性. <maven实战>一书实现了两个模块account-email和account-persist用以实现一个用户注册的项目. 在本文中,也使用这个例子来讲述聚合与继承. 聚合:  由于

Maven学习总结(五)——聚合与继承【如果想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合】

一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module> 3 <module>模块二</module> 4 <module>模块三</module> 5 </modules> 例如:对项目的Hello.HelloFriend.MakeFriends这三个模块进行聚合 1 <modules>