上一篇文章学习了maven的依赖关系,并且使用maven和hibernate结合起来实现了一个简单的demo,可以看出使用maven来管理项目还是很方便的,再也不用手动的找需要的jar文件了,只需要手动的配置即可,可是大家有没有发现一个问题。
上一篇我们创建了两个工程,”user-core”,”user-dao”,但是在编译打包的时候是分别进行操作的,那么如果我有很多工程,每个工程单独来进行编译打包等操作是很麻烦的,不过可以使用maven的聚合技术进行简单的配置就可以完成这样的需求了。
maven聚合
- 首先创建一个user-total的工程
- 由于使用maven聚合只需要用到pom.xml文件中配置即可,所以删除没用的目录:”src/main/java”和”src/test/java”.
- 删除pom.xml中的所有依赖
到目前为止,项目结构如下:
- 在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既有聚合功能,又有继承功能。
版权声明:本文为博主原创文章,未经博主允许不得转载。