Spring Boot 学习前你应该知道的 Maven 知识


Maven 是什么?

回答这个问题,我们先来了解下没有Maven,我们是怎么使用开发者工具IDE去开发Java程序的。我之前开发Java程序不多,但是我还是记得,我是从网上下载或从合作方拷贝 jar 包,从 Library 中添加到项目依赖,就这样构件一堆外部依赖来执行本地程序。

从事 ASP.NET 开发(C#)的朋友,更能清晰地表达出这个意思,DLL 文件漫天飞,只要拷贝过来就能用啦。

这将带来什么问题呢,比如同学A 和同学B 是一个项目的两个功能一个是CMS系统,一个是做问答系统,两个都是独立开发,使用了相同的 Json 库,但是版本不同,当他们合并项目的时候,问题来了,他们的第三方库管理混乱就出现了不少麻烦。相互兼容成了最大的问题。

当嵌套依赖出现的,内心几乎是奔溃的,见下图:
当项目 A引用了 组件B ,项目C 引用了组件 D,组件B,D都引用了 组件 E,但是B 引用了版本E1,D引用了版本E2,B 和D都是第三方组件,是不是很麻烦。这些大部分是因为第三方组件管理混乱。

有没有什么好的方法,使得开发者不在关系第三方组件管理,而是专心于业务的开发,Maven就是这样的管理工具,

Apache Maven是一个软件项目管理和理解工具。基于项目对象模型思想,Maven可以管理一个项目的构建、报告和信息中心文档

Maven为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为Maven使用了一个标准的目录结构和一个默认的构建生命周期。

Maven 具体完成什么工作呢

  1. 构建
  2. 文档生成
  3. 报告
  4. 依赖
  5. SCMs
  6. 发布
  7. 分发
  8. 邮件列表

总的来说,Maven简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、文档生成、团队合作和其他任务。Maven提高了重用性,负责了大部分构建相关任务。

什么是Maven仓库

Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。

  1. 本地仓库:Maven本地的Jar包仓库。

  2. 中央仓库: Maven官方提供的远程仓库。

当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。

Maven特点 约定优于配置

Maven 使用约定而不是配置,意味着开发者不需要再自己创建构建过程。
开发者不需要再关心每一个配置细节。Maven为工程提供了合理的默认行为。当创建Maven工程时,Maven会创建默认的工程结构。开发者只需要合理的放置文件,而在 pom.xml 中不再需要定义任何配置。

下表展示了工程源码文件、资源文件的默认配置,和其他一些配置。假定${basedir}表示工程目录:

配置项 默认值
source code ${basedir}/src/main/java
resources ${basedir}/src/main/resources
Tests ${basedir}/src/test
Complied byte code ${basedir}/target
distributable JAR ${basedir}/target/classes

为了构建工程,Maven 为开发者提供了选项来配置生命周期目标和工程依赖(依赖于 Maven 的插件扩展功能和默认的约定)。大部分的工程管理和构建相关的任务是由 Maven 插件完成的。

Maven 的安装 window mac

在安装 IDEA 开发工具的时候,默认包含了 Maven 的安装,当前版本一般安装了 Maven2 和 Maven3。当然我们也是可以独立安装最新版本的 Maven。

window 下的 Maven 安装

  1. 从官方网站下载(http://maven.apache.org/download.cgi)
  2. 解压,如果解压到 C:\maven3.6,注意确保您安装了 Java JDK。
  3. 设置环境变量
M2_HOME = C:\maven3.6
Path 添加 %M2_HOME%/bin

测试一下 使用 Ctrl+R 打开 cmd 窗口,输入

mvn -version

mac 下的 Maven 安装

  1. 从官方网站下载(http://maven.apache.org/download.cgi)
  2. 解压,如果解压到 \home\maven3.6,注意确保您安装了 Java JDK。
  3. 设置环境变量
export MAVEN_HOME=/Users/zhang/Documents/apache-maven-3.6
export PATH=${MAVEN_HOME}/bin:$PATH

输入 source source /etc/profile 使得程序生效
测试一下 打开终端窗口

mvn -v

Maven 的 Pom.xml

什么是“坐标”?

在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
groupIdartifactId 构成了一个Jar包的坐标


	org.apache.poi
	poi-ooxml
	3.9

  1. groupId:所需Jar包的项目名
  2. artifactId:所需Jar包的模块名
  3. version:所需Jar包的版本号

传递依赖 与 排除依赖

  1. 传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用的Jar包都下载到本地。
  2. 排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)

依赖范围 scope

在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。

  • compile :默认范围,用于编译
  • provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
  • runtime: 在执行时需要使用
  • test: 用于test任务时使用
  • system: 需要外在提供相应的元素。通过systemPath来取得
  • systemPath: 仅用于范围为system。提供相应的路径
  • optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用

依赖冲突

若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。

  • 短路优先
    例如下面的引用关系如下:
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
本项目——>A.jar——>B.jar——>X.jar

那么下面中引用的是 C.jar 中的 X.jar

在此时,Maven只会引用引用路径最短的Jar。

  • 声明优先

若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。而不是后声明的覆盖前面的。

聚合

  • 什么是聚合?

将多个项目同时运行就称为聚合。

  • 如何实现聚合?

只需在 pom 中作如下配置即可实现聚合:


    web-connection-pool
    web-java-crawler

继承

  1. 什么是继承?

在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。

  1. 如何实现继承?
    -父 pom 配置如下

    
          
            cn.missbe.web.search
            resource-search
            pom
            1.0-SNAPSHOT
           
    

  • 子项目 pom 配置

        父pom所在项目的groupId
        父pom所在项目的artifactId
        父pom所在项目的版本号

 
        resource-search
        cn.missbe.web.search
        1.0-SNAPSHOT

Maven 命令

  1. -v:查询Maven版本

本命令用于检查maven是否安装成功。

Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。

  1. compile:编译

将java源文件编译成class文件

  1. test:测试项目

执行test目录下的测试用例

  1. package:打包

将项目打成jar包

  1. clean:删除target文件夹

  2. install:安装

将当前项目放到Maven的本地仓库中。供其他项目使用

我们可以使用 mvn clean install 来发布我们的基于 maven 的 spring boot 项目

使用Maven构建Web项目

通常我们使用 IDEA 构件 Maven项目

pom.xml 节点注解说明

     
        
        
         
         
         
         
         
           
     
        
    4.0.0     
         
    cn.missbe.web     
         
    search-resources     
         
    war     
         
    1.0-SNAPSHOT     
         
    search-resources     
         
    http://www.missbe.cn     
         
    A maven project to study maven.     
        
     
      
        
       
    
      
        
         
      
      
      
      
      
      
      
      
      
      
      
       
       
        
        
        
        
        
        
       
      
  
      
      
       
       
        
        
        
        
        
        
        
        
        
        
       
      
      
      
       
       
        
       
      
      
      
      
      
      
      
      
      
       
       
        
        
         
         
         
         
         
         
         
         
         
         
          
          
           
           
           
           
           
           
           
           
           
           
          
         
         
         
          
          
       ......    
          
              
         
         
         
         
        
       
      
      
      
       
       
        
        
         
          
         
        
        
         
         
      ......    
         
        
        
       
      
     
     
     
         
         
         
            
             
             
              
        
        
        
        
        
       
       
       
        
       
       
   banseon-repository-proxy     
       
            banseon-repository-proxy     
                
            http://192.168.1.169:9999/repository/     
                
            default               
             
        
        
        
         
      
   ......    
      
     
 
         
         
            
       
            org.apache.maven     
                
            maven-artifact     
                
            3.8.1     
                
            jar    
                
                
                 
            test       
                
                 
                
                
                  
                    spring-core     
                    org.springframework     
                     
                   
                 
            true    
            
        
   
  
     
     
      
       
       
    ......    
       
      
        
         
        
            
            
             
       
   banseon-maven2     
   banseon maven2     
            file://${basedir}/target/deploy     
                
      
       
      
       
   banseon-maven2    
            Banseon-maven2 Snapshot Repository    
            scp://svn.baidu.com/banseon:/usr/local/maven-snapshot     
       
      
       
            
              
            banseon-site     
                
            business api website     
                
                 
                scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web      
                 
            
      
    
      
             
        
        
        

相关