Maven聚合
在实际的项目中,一个项目通常会划分为多个模块,为了说明问题,以用户登陆这个小web应用为例。通常一个web应用分为三个模块:
Maven聚合
在实际的项目中,一个项目通常会划分为多个模块,为了说明问题,以用户登陆这个小web应用为例。通常一个web应用分为三个模块:
1. 模型和数据持久化层user-core,
2. 业务逻辑层user-service以
3. web展现层user-web,
user-service依赖于user-core
user-web依赖于user-core和user-service
这三个模块都是Maven项目(在Intellij Idea中称为Module),都有各自的pom.xml,如果我们单独管理这些模块,单独的编译、运行单元测试和打包,不仅很繁琐,而且不符合项目管理的理念,为了应对这种情况,Maven提供了maven模块聚合的功能
如何Maven聚合
1.Intellij Idea对Maven的支持
Intellij Idea中,Maven聚合是默认的,建立一个Maven项目(概念上类似于Eclipse的Workspace),取名叫user-project,那么这个项目包含一个pom.xml,这个项目就是用于Maven聚合。有了user-project这个Maven项目,可以为Maven项目添加Maven模块,这在Idea里可以在Project视图的项目名上点击右键,选择新建一个Maven模块,这里创建3个模块,user-core,user-service,user-web,每个模块有自己的pom文件。打开user-project的pom.xml文件,它的内容是
<?xml version="1.0" encoding="UTF-8"?> <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>LearnMaven</groupId> <artifactId>LearnMaven-user</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>user-core</module> <module>user-service</module> <module>user-web</module> </modules> </project>这里确定几个问题:
1)jar,表示maven模块打包成jar包,这是默认值
2)war,表示maven模块打包成war包,
3)pom,表示maven模块不提供具体的输出,只用来做pom项目管理,这就以为它是一个聚合用的Maven项目
2.Eclipse的Maven支持
Eclipse的m2eclipse插件对Maven的支持远不如Intellij Idea对Maven的支持,这也是Intellij Idea流行起来的主要原因之一,在Eclipse中,只能建立四个平级的Maven项目
user-project
user-core
user-service
user-web
因为user-project的pom.xml跟user-core,user-service,user-web不在同一个目录下了,因此在user-project的pom.xml指定聚合模块的就需要指定上级目录
<?xml version="1.0" encoding="UTF-8"?> <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>LearnMaven</groupId> <artifactId>LearnMaven-user</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>../user-core</module> <module>../user-service</module> <module>../user-web</module> </modules> </project>
Maven继承
Maven聚合的目的是让Maven的聚合模块统一管理项目的各个maven模块,同样,这些被管理的maven模块可以继承这个聚合模块或者另外一个packaging为pom的maven模块(比如单独定义一个子模块,定义为user-parent), 这么做的好处是
1.在user-parent中定义项目的公共属性,这些属性在各个子模块中公用
2.项目各个模块依赖的依赖的版本,各个模块是一样的,就可以将它们集中到一起集中管理
3.使用<dependencyManagement><dependencies></dependencies></dependencyManagement>集中管理依赖,在子模块中的pom.xml中的依赖声明中只声明groupId和artifactId
maven模块声明继承另外一个maven模块
子模块的parent元素
<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"> <parent> <artifactId>user-artifact</artifactId> <groupId>user-project</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-core</artifactId> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency> </dependencies> </project>
上面定义了,user-core这个模块继承自user-project这个聚合模块。同时,user-core依赖于slf4j,我们看到它的依赖包含了groupId,artifactId,version,如何省略version呢?
聚合模块(同时也是父模块)的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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>user.project</groupId> <artifactId>user.artifact</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>user.core</module> <module>user.service</module> <module>user-web</module> </modules> <properties> <!--version constants for the dependents-> <slf4j.version>1.7.7</slf4j.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <!--The value is defined as property--> <version>${slf4j.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
user-core模块的pom.xml定义
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>learn</artifactId> <groupId>LearnProject</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-core</artifactId> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <!--No version is specified here,it inherits from its parent--> </dependency> </dependencies> </project>
总结
1. 聚合和继承的关系
聚合模块(user-project)和继承模块(user-parent)可以是一个模块,也可以是两个独立的模块:
Intellij Idea中同一个模块的项目结构
user-project(user-parent)
user-core
user-service
user-web
Intellij Idea中两个模块的项目结构,Intellij Idea自动将user-parent聚合到user-project中,这其实是没有必要的
user-project
user-parent
user-core
user-service
user-web
Eclise中同一个模块的项目结构
user-project(user-parent)
user-core
user-service
user-web
Eclise中独立两个模块的项目结构
user-project
user-parent
user-core
user-service
user-web
user-project不必聚合user-parent,user-parent也不必继承自user-project,但是user-project聚合了user-core,user-service,user-web;user-core,user-service,user-web继承自user-parent。