[Maven学习笔记五]Maven聚合和继承特性

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>
 这里确定几个问题:

 

 

  • project的packaging,它有三个取值

        1)jar,表示maven模块打包成jar包,这是默认值

        2)war,表示maven模块打包成war包,

        3)pom,表示maven模块不提供具体的输出,只用来做pom项目管理,这就以为它是一个聚合用的Maven项目

 

  • project的modules,module用于指定要聚合哪些moven模块,这里有三个,user-core,user-service,user-web
  • module的值user-core,user-service,user-web,这些值从何而来,聚合项目如何知道去哪里找这些模块这个是根据目录来控制的,Maven聚合项目的pom.xml必定和user-core,user-service,user-web三个目录同级,

 

 

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。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(maven)