maven学习笔记(超详细总结)

目录

  • 项目管理利器——maven
  • 第1章 maven概述
    • 1-1 项目管理利器-maven简介
      • 1.1.1 什么是maven
      • 1.1.2 什么是依赖管理
      • 1.1.3 传统项目的依赖管理
      • 1.1.4 maven项目的依赖管理
      • 1.1.5 什么是项目构建
      • 1.1.6 Maven好处
  • 第2章 maven快速入门
    • 2-1 环境搭建
      • 下载后解压的目录对应的含义
      • 配置环境变量
    • 2-2 第一个maven案例hellomaven
      • 文件结构
      • 网上实例
  • 第3章 Maven核心知识
    • 3-1 maven常用的构建命令
    • 3-2 maven自动建立目录骨架
    • 3-3 maven中的坐标和仓库
      • 3.3.1 Maven仓库的概述
      • 3.3.2 修改本地仓库位置
      • 3.3.3 三种仓库的关系
    • 3-4 在eclipse中安装maven插件以及创建maven项目
    • 3-5 maven的生命周期和插件
      • 3.5.1 maven的三种生命周期
      • 3.5.2 命令与生命周期关系
      • 3.5.3 插件
    • 3-6 maven中Pom.xml解析
      • 3.6.1 基础配置
      • 3.6.2 构建配置
      • 3.6.3 分发配置
      • 3.6.4 仓库配置
      • 3.6.5 profile配置
      • 3.6.6 报表配置
      • 3.6.7 环境配置
      • 3.6.8 项目信息配置
    • 3-7 maven依赖范围
      • 3.7.1 什么是依赖范围?
      • 3.7.2 依赖范围在pom.xml中如何体现?
      • 3.7.3 有哪些依赖范围?
      • 表格总结
    • 3-8 maven依赖传递和依赖原则
    • 3-9 maven聚合和继承
      • 3.9.1 继承
      • 3.9.2 聚合
      • 3.9.3 继承与聚合的关系
  • 第4章 如何构建web项目
    • 4-1 使用maven构建web项目

项目管理利器——maven

简介:maven是优秀的项目管理和构建工具,能让我们更为方便的来管理和构建项目,从最基础的环境配置,到maven核心知识点的应用,本笔记将带领大家进行一段轻松的maven之旅。让我们一起使用maven来构建和管理Java项目吧!

第1章 maven概述

视频来源:慕课网

1-1 项目管理利器-maven简介

1.1.1 什么是maven

是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的。Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

1.1.2 什么是依赖管理

一个java项目需要外部的第三方jar包来进行支持。我们说这个java项目依赖了这些jar包。
依赖管理就是将项目所依赖的jar包按照一定规则进行规范化管理。

1.1.3 传统项目的依赖管理

传统的依赖管理就是程序员需要什么jar包,去网上进行下载,然后手动添加到工程中。
缺点:

  • jar包从网上不好找
  • jar包没有进行统一管理,容易造成jar包重复及版本冲突
  • jar包全部添加到工程中,造成工程过大

1.1.4 maven项目的依赖管理

maven项目有一个文件叫pom.xml。我们通过在此文件中配置jar包的坐标即可将jar包引入到工程中。Jar包的坐标可从maven仓库中获取。
好处:

  • 通过pom配置来引入jar包,避免了jar包的版本冲突。
  • Maven团队维护了一个jar包仓库,十分全,避免了去网上寻找jar包的尴尬,节省时间。

1.1.5 什么是项目构建

项目构建是一个项目从编写源代码到编译,测试,运行,打包,部署,运行的过程。

1.1.5.1 传统项目构建过程

(1) 在eclipse中新建一个WEB工程。
(2) 进行编码及编写配置文件
(3) 对源代码进行编译运行,生成class文件
(4) 打成war包,部署至tomcat

1.1.5.2 Maven项目构建过程

一个命令tomcat:run完成对项目的构建。

1.1.6 Maven好处

  • 一步构建:一个命令即可启动。
  • 依赖管理:对jar包统一管理,避免冲突等问题
  • 跨平台:可在windows及linux下运行
  • 有利于提高大型项目的团队开发效率
  • 越来越多的公司使用maven

第2章 maven快速入门

本章介绍如何在windows环境下搭建maven环境,以及用一个简单的案例来快速体验下maven项目的构建过程。

2-1 环境搭建

下载地址:http://maven.apache.org/download.cgi

下载后解压的目录对应的含义

目录在F:\java\资料\java组件\maven3.6.2
bin目录:maven的运行文件。mvn.cmd正常运行mvn,mvnDebug.cmd已debug方式运行maven。
boot目录:maven运行需要类加载器。
conf目录:maven的配置文件目录,核心配置文件为其中的setting.xml。
lib目录:maven所需要的jar包。

配置环境变量

2-2 第一个maven案例hellomaven

maven管理的项目,在项目名称文件夹下有src文件夹和pom.xml文件,运行后会有target文件夹。其中src下又有main、test、resources文件夹,分别存放实现业务需求的方法、测试方法、静态文件。pom.xml则是此项目的jar包配置管理文件。
下面实现一个HelloWorld方法,看一下项目的文件结构

文件结构

网上实例

参考

第3章 Maven核心知识

本章介绍maven中的重要知识点:如maven的目录骨架分析,默认仓库的更改,坐标的概念,依赖的概念,eclipse中插件的安装。

3-1 maven常用的构建命令

maven命令语句
mvn -v 查看maven版本
mvn compile 用来将src/main/java下的文件编译为class文件,并输出到target中。
mvn test test 用来将src/main/test下的文件进行编译,同时执行一次
mvn package 打包,将项目进行打包,如果是jar打包为jar,war打包为war。

mvn clean 删除编译产生的target文件夹
mvn install 安装jar包到本地仓库中

3-2 maven自动建立目录骨架

2种方式,详细说明

3-3 maven中的坐标和仓库

相关信息参考文献:
坐标:构件
仓库:本地仓库和远程仓库
详细说明
镜像仓库
说明
更改仓库位置
说明

3.3.1 Maven仓库的概述

maven仓库用来存储jar包。maven项目都是从仓库中获取jar包。maven仓库分三种:本地仓库,远程仓库,中央仓库。
本地仓库:用来存储从远程仓库及中央仓库下载的jar包,自己来维护。项目使用的jar包优先从本地仓库获取。本地仓库的默认位置在\({user.home}/.m2/repository。\){user.home}表示用户所在的位置。
远程仓库:如果本地仓库没有所需要的jar包,默认去远程仓库下载。远程仓库由公司来进行维护又可称为私服。
中央仓库:中央仓库由maven团队来进行维护,服务于整个互联网。其仓库中存储大量的jar包。

3.3.2 修改本地仓库位置

本地仓库的配置在settings.xml文件中修改。

3.3.3 三种仓库的关系

本地项目需要jar包,先从本地仓库中获取,如果本地仓库中没有,则从私服中获取,如果私服没有,则从中央仓库获取。获取到后,本地仓库及远程仓库各存储一份。如果没有远程仓库,本地仓库则直接从中央仓库获取,然后在本地仓库存储一份。

3-4 在eclipse中安装maven插件以及创建maven项目

视频
详细说明:4.4节:创建web

3-5 maven的生命周期和插件

3.5.1 maven的三种生命周期

maven对项目的构建分为三套相互独立的生命周期。
cleanLifecycle:在项目构建前,先进行一些清理工作。
defaultLifecycle:构建的核心部分,编译,测试,打包,部署。
siteLifecycle:生成项目报告,站点,发布报告。

maven的每个生命周期都有很多阶段,每个阶段对应一个执行命令。

clean

1、clean生命周期:清理项目,包含三个phase。
1)pre-clean:执行清理前需要完成的工作
2)clean:清理上一次构建生成的文件
3)post-clean:执行清理后需要完成的工作

default

2、default生命周期:构建项目,重要的phase如下。
1)validate:验证工程是否正确,所有需要的资源是否可用。
2)compile:编译项目的源代码。
3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
4)package:把已编译的代码打包成可发布的格式,比如jar。
5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
6)verify:运行所有检查,验证包是否有效且达到质量标准。
7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
8)deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。

site

3、site生命周期:建立和发布项目站点,phase如下
1)pre-site:生成项目站点之前需要完成的工作
2)site:生成项目站点文档
3)post-site:生成项目站点之后需要完成的工作
4)site-deploy:将项目站点发布到服务器

3.5.2 命令与生命周期关系

每个maven命令对应生命周期的某一阶段,例如clean命令对应maven的clean阶段。test命令对应maven的default阶段。
执行命令会自动将该阶段以前的命令执行,例如执行clean命令,将自动执行pre-clean命令。
执行某个生命周期某个阶段,不会影响生命周期其他阶段。
如果要执行多个生命周期的命令,中间用空格隔开,例如mvn clean compile。

3.5.3 插件

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。

用户可以通过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与 compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。

MAVEN插件介绍和配置

3-6 maven中Pom.xml解析

参考资料

setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件;而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。

3.6.1 基础配置

一个典型的pom.xml文件配置如下:

  
  
      
    4.0.0  
  
      
    com.winner.trade  
  
      
    trade-core  
  
      
    1.0.0-SNAPSHOT  
  
      
    jar  
  
      
    ...  
  
      
      
  
          
          
  
               
              
            com.winner.trade  
            trade-test  
            1.0.0-SNAPSHOT  
  
              
              
            test  
  
              
            false  
  
              
              
                  
                    org.slf4j  
                    slf4j-api  
                  
              
  
          
  
      
  
      
      
        UTF-8  
        1.5  
        1.5  
      
  
    ...  
  

一般来说,上面的几个配置项对任何项目都是必不可少的,定义了项目的基本属性。
这里有必要对一个不太常用的属性classifier做一下解释,因为有时候引用某个jar包,classifier不写的话会报错。
classifier元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成 如kimi-app-2.0.0-javadoc.jar (Java文档)、 kimi-app-2.0.0-sources.jar(Java源代码)这样两个附属构件。这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。
classifier的用途在于:

  1. maven download javadoc / sources jar包的时候,需要借助classifier指明要下载那个附属构件
  2. 引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一的确定某个构件,需要借助classifier来进一步明确目标。比如JSON-lib,有时候会同一个版本会提供多个jar包,在JDK1.5环境下是一套,在JDK1.3环境下是一套


引用它的时候就要注明JDK版本,否则maven不知道你到底需要哪一套jar包:


    net.sf.json-lib
    json-lib
    2.4
    jdk15

3.6.2 构建配置

  
  
      
    myPorjectName  
  
      
    ${basedir}/target  
  
      
      
    install  
  
      
      
      
        ../filter.properties  
      
  
      
      
          
  
              
              
              
            resources  
  
              
            true  
  
              
            src/main/resources  
  
              
              
                **/*.properties  
                **/*.xml  
              
  
              
              
                jdbc.properties  
              
  
          
      
  
      
      
          
              
              
              
              
              
          
      
  
      
    ${basedir}\src\main\java  
  
      
    ${basedir}\src\main\scripts  
      
  
      
    ${basedir}\src\test\java  
  
      
    ${basedir}\target\classes  
  
      
    ${basedir}\target\test-classes  
      
  
      
      
      
      
  
          
          
          
          
          
          
            org.apache.maven.wagon  
            wagon-ssh  
            2.8  
          
  
      
  
      
      
          
              
            maven-assembly-plugin  
            2.5.5  
  
              
              
                  
  
                      
                    assembly  
  
                      
                    package  
  
                      
                      
                        single  
                      
  
                      
                    false  
  
                  
              
  
              
              
                ${finalName}  
                false  
                assembly.xml  
              
  
              
              
            false  
  
              
              
                ...  
              
  
              
            true  
  
          
      
  
      
      
      
      
        ...  
      
  
  

pom里面的仓库与setting.xml里的仓库功能是一样的。主要的区别在于,pom里的仓库是个性化的。比如一家大公司里的setting文件是公用的,所有项目都用一个setting文件,但各个子项目却会引用不同的第三方库,所以就需要在pom里设置自己需要的仓库地址。

3.6.3 分发配置

  
  
  
  
      
      
  
          
          
        true  
  
         repo-id   
         repo-name  
        file://${basedir}/target/deploy   
          
  
      
  
      
      
          
          
          
          
          
      
  
      
      
  
          
         site-id   
  
          
         site-name  
  
          
        scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web   
  
      
  
      
      
      
  
      
      
  
          
          
  
          
          
  
          
          
  
          
          
  
      
  
      
      
      
      
  
  

3.6.4 仓库配置

  
  
  
      
      
  
          
          
  
              
              
  
              
              
              
              
  
              
              
              
  
          
  
          
          
          
          
              
              
              
          
  
          
         repo-id   
  
          
         repo-name  
  
          
        http://192.168.1.169:9999/repository/   
  
          
          
          
          
         default  
  
      
  
  
  
  
  
  
      
      
  
  

3.6.5 profile配置

  
  
  
      
      
          
          
  
              
            false  
  
              
            1.7  
  
              
              
  
                  
                Windows XP  
  
                  
                Windows  
  
                  
                x86  
  
                  
                5.1.2600  
  
              
  
              
              
              
  
                  
                mavenVersion  
  
                  
                2.0.3  
  
              
  
              
              
              
  
                  
                /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/  
  
                  
                /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/  
  
              
  
          
          
          
          
          
          
          
          
          
          
          
      

profile配置项在setting.xml中也有,是pom.xml中profile元素的裁剪版本,包含了id,activation, repositories, pluginRepositories和properties元素。这里的profile元素只包含这五个子元素是因为setting.xml只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。

pom.xml中的profile可以看做pom.xml的副本,拥有与pom.xml相同的子元素与配置方法。它包含可选的activation(profile的触发器)和一系列的changes。例如test过程可能会指向不同的数据库(相对最终的deployment)或者不同的dependencies或者不同的repositories,并且是根据不同的JDK来改变的。只需要其中一个成立就可以激活profile,如果第一个条件满足了,那么后面就不会在进行匹配。

3.6.6 报表配置

  
  
  
  
      
      
  
      
      
  
      
      
  
          
              
              
              
              
              
                  
                    http://java.sun.com/j2se/1.5.0/docs/api/  
                  
              
              
              
              
              
  
                  
                  
  
                      
                    sunlink  
  
                      
                      
  
                      
                      
  
                      
                      
                        javadoc  
                      
  
                  
  
              
  
          
  
      
  
     

3.6.7 环境配置

  
  
  
      
     jira   
  
      
     http://jira.clf.com/  
  
  
  
  
  
  
      
      
  
      
      
  
      
      
  
          
          
  
              
              
  
              
              
  
              
              
  
              
              
  
              
              
  
              
            

3.6.8 项目信息配置

  
banseon-maven   
  
  
http://www.clf.com/   
  
  
  
  
A maven project to study maven.   
  
  
  
  
      
      
  
  
  
  
  
  
  
  
  
      
      
  
          
         Demo   
  
          
         [email protected]  
  
          
         [email protected]  
  
          
         [email protected]  
  
          
         http:/hi.clf.com/  
  
      
  
  
  
  
  
  
      
      
  
          
         HELLO WORLD   
  
          
         banseon   
  
          
         [email protected]  
  
          
          
  
          
          
             Project Manager  
            Architect   
          
  
          
         demo  
  
          
        http://hi.clf.com/   
  
          
          
             No   
          
  
          
         -5  
  
      
  
  
  
  
  
  
      
      
          
          
          
          
          
          
          
          
      
  
  
  
  
  
  
  
      
      
  
          
         Apache 2   
  
          
        http://www.clf.com/LICENSE-2.0.txt   
  
          
         repo  
  
          
         Abusiness-friendly OSS license   
  
      
  
  
  
  
  
  
      
    scm:svn:http://svn.baidu.com/banseon/maven/  
  
      
    scm:svn:http://svn.baidu.com/banseon/maven/  
      
  
      
      
  
      
     http://svn.baidu.com/banseon  
  
  
  
  
  
  
      
     demo   
  
      
     http://www.clf.com/  
  
   

3-7 maven依赖范围

3.7.1 什么是依赖范围?

maven项目不同的阶段引入到classpath中的依赖是不同的,例如,编译时,maven会将与编译相关的依赖引入classpath中,测试时,maven会将测试相关的的依赖引入到classpath中,运行时,maven会将与运行相关的依赖引入classpath中,而依赖范围就是用来控制依赖于这三种classpath的关系。

3.7.2 依赖范围在pom.xml中如何体现?

pom文件如下配置:


    junit
    junit
    4.7
    test

其scope标签就是依赖范围的配置,默认是compile,可选配置有test、provided、runtime、system、import

3.7.3 有哪些依赖范围?

即标签的可选配置:compile、test、provided、runtime、system、import,下面一一介绍:
1) 编译依赖范围(compile),该范围就是默认依赖范围,此依赖范围对于编译、测试、运行三种classpath都有效,举个简单的例子,假如项目中有spring-core的依赖,那么spring-core不管是在编译,测试,还是运行都会被用到,因此spring-core必须是编译范围(构件默认的是编译范围,所以依赖范围是编译范围的无须显示指定)

      
    org.springframework
    spring-core
    2.5        compile

2)测试依赖范围(test),顾名思义就是针对于测试的,使用此依赖范围的依赖,只对测试classpath有效,在编译主代码和项目运行时,都将无法使用该依赖,最典型的例子就是 Junit, 构件在测试时才需要,所以它的依赖范围是测试,因此它的依赖范围需要显示指定为test ,当然不显示指定依赖范围也不会报错,但是该依赖会被加入到编译和运行的classpath中,造成不必要的浪费 。

      
    junit      
    junit        
    4.7       
    test    

3)已提供依赖范围(provided),使用该依赖范围的maven依赖,只对编译和测试的classpath有效,对运行的classpath无效,典型的例子就是servlet-api,编译和测试该项目的时候需要该依赖,但是在运行时,web容器已经提供的该依赖,所以运行时就不再需要此依赖,如果不显示指定该依赖范围,并且容器依赖的版本和maven依赖的版本不一致的话,可能会引起版本冲突,造成不良影响。

      
    javax-servlet
    servlet-api
    2.0
    provided

4)运行时依赖范围(runtime),使用该依赖范围的maven依赖,只对测试和运行的classpath有效,对编译的classpath无效,典型例子就是JDBC的驱动实现,项目主代码编译的时候只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现上述接口的具体JDBC驱动。

5)系统依赖范围(system),该依赖与classpath的关系与provided依赖范围完全一致,但是系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用,systemPath元素可以引用环境变量:

      
    javax.sql
    jdbc-stext
    2.0
    system
    ${java.home}/lib/rt.jar

6)导入依赖范围(import),该依赖范围不会对三种classpath产生影响,该依赖范围只能与dependencyManagement元素配合使用,其功能为将目标pom文件中dependencyManagement的配置导入合并到当前pom的dependencyManagement中。有关dependencyManagement的功能请了解maven继承特性。

表格总结

scope 编译 测试 运行
compile Y Y Y
test Y
provided Y Y
runtime Y Y
system Y Y

3-8 maven依赖传递和依赖原则

A->B,B->C====>A->C
别人总结
可以在A的pom.xml用这个标签消除对C的依赖

3-9 maven聚合和继承

别人总结

3.9.1 继承

在构建多个模块的时候,往往会多有模块有相同的groupId、version,或者有相同的依赖,为了减少pom文件的配置,跟我们的项目中类的继承一样,在父工程中配置了pom,子项目中的pom可以继承.

可继承的POM元素

  • groupId:项目组ID,项目坐标的核心元素
  • version:项目版本,项目坐标的核心元素
  • description:项目的描述信息
  • organnization:项目的组织信息
  • inceptionYear:项目的创始年份
  • url:项目的URL地址
  • developers:项目的开发者信息
  • dependencies:项目的依赖配置
  • dependencyManagement:项目的依赖管理配置
  • repositories:项目的仓库配置
  • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

继承POM的用法
面向对象设计中,程序员可以通过一种类的父子结构,在父类中声明一些字段和方法供子类继承,这样可以做到“一处声明、多处使用”,类似的我们需要创建POM的父子结构,然后在父POM中声明一些配置,供子POM继承。

子工程gropid 和version没写,是因为子工程的groupid和version和父工程的一样.所以子工程继承了父工程,但是当子工程的groupid,version和父工程的不一样的时候,就需要自己重写.父模块只是为了帮助消除配置的重复,因此它本身不包含除POM之外的项目文件,也就不需要src/main/java之类的文件夹了。

integral-kernel-parent
     
    pom

    
    com.dmsdbj.cloud
    cloud-integral-parent
    0.0.2-SNAPSHOT
    

在父pom 中定义了整个项目所需要的依赖,如tools等.


        
            com.dmsdbj.cloud
            cloud-tool
            0.0.2-SNAPSHOT
            provided
        

        
            org.projectlombok
            lombok
            provided
        

依赖管理
当多有模块中有相同的依赖时,我们可以将这些依赖提取出来,同一在父POM中声明,这样就可以简化子模块的配置了,但是这样还是存在问题,当想在项目中加入一些,不需要这么多依赖的模块,如果让这个模块也依赖那些不需要的依赖,显然不合理。

Maven提供的dependentcyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活度。在dependentcyManagement元素下的依赖声明不会引入实际的依赖,而是定义了依赖的版本,对版本进行同一管理,避免出现版本不一致的情况


        
            
                org.springframework.boot
                spring-boot-dependencies
                ${spring-boot-dependencies.version}
                pom
                import
            

            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud-dependencies.version}
                pom
                import
            
        

dependencyManagement声明的依赖既不会给项目引入依赖,也不会给它的子模块引入依赖,不过这段配置是会被继承的。真正地引入到项目中是在子项目的pom文件中进行定义声明的.

dependencyManagement声明依赖能够统一规范项目中依赖的版本,当依赖的版本在父POM中声明之后,子模块在使用依赖的时候就无效声明版本,也就不会发生多个子模块使用依赖版本不一致的情况。这可以降低依赖冲突的几率。

3.9.2 聚合

在我们的项目中有controller,service,dao层,每一个里面都有pom文件,在构建的需要把每一个都进行构建,但是有了聚合,我们创建一个额外的模块。然后通过该模块,来构建整个项目的所有模块把他们聚合到一起,能够使用一条命令就构建多个模块,聚合工程的结构如下:

pom文件如下:

  
        e3-parent
        cn.e3mall
        1.0-SNAPSHOT
        ../e3parent/pom.xml
    

    4.0.0
    cn-manager
    1.0-SNAPSHOT

    
        e3-manager-pojo
        e3-manager-dao
        e3-manager-interface
        e3-manager-service
        e3-manager-web
    
    pom

一个特殊的地方就是packaging,其值为pom,如果没有声明的话,默认为jar,对于聚合模块来说,其打包方式必须为pom,否则无法构建。

modules里的每一个module都可以用来指定一个被聚合模块,这里每个module的值都是一个当前pom的相对位置。

3.9.3 继承与聚合的关系

继承是为了减少配置,配置是为了方便快速构建项目.
继承:在子工程的pom 文件中定义元素
聚合:它知道有哪些被聚合的模块,但那些被聚合的子模块不知道这个聚合模块的存在.
为了方便,有的工程既是聚合工程也是父工程.

第4章 如何构建web项目

介绍如何使用maven创建web项目,如何安装jetty插件和tomcat插件,并简介如何将项目打包到jetty和tomcat中,并运行。

4-1 使用maven构建web项目

https://www.cnblogs.com/hongmoshui/p/7994759.html

转载于:https://www.cnblogs.com/baizihua/p/11519509.html

你可能感兴趣的:(maven学习笔记(超详细总结))