【Java】中Maven依赖详解

14天阅读挑战赛

一、maven概念
      maven是 Apache 下的一个纯 Java 开发的开源项目。
      基于项目对象模型(缩写:POM)概念,
      Maven利用一小段描述信息管理一个项目的构件。
      Maven 是一个项目管理工具,
      可以对 Java 项目进行构建以及对依赖进行管理。

二、Maven环境安装
    1、maven官方网站
       http://maven.apache.org/
       下载apache-maven-3.5.0-bin.zip压缩包
    
    2、解压压缩包到D盘根目录下
       目录结构
         --bin:mvn的运行脚本
         --conf:配置文件
         --boot:包含一个类加载器框架
         --lib:maven运行时类库

    3、配置maven环境变量
          环境变量: 
          MAVEN_HOME    D:\apache-maven-3.5.0
          Path          %MAVEN_HOME%\bin;
          测试:mvn -v  查看当前版本
  
    4、修改本地仓库默认位置(主要用于存储从网络上下载的jar)
        1>在maven根目录下新建一个空目录repository
        2>在con/settings.xml中配置
       D:\apache-maven-3.5.0\repository

    5、修改maven项目默认的jre版本(默认1.5)
        拷贝以下配置到conf/settings.xml的profiles中
    
        jdk-1.8
            
            true
            1.8
        

        
            1.8
            1.8
            1.8
        

    

    6、在eclipse中配置maven插件
    1>确保eclipse版本为4.0以上
    2>window-->preferences-->Maven-->Installations-->关联maven
    3>User Settings-->关联conf/settings.xml


三、maven项目构建及常用命令
  1、项目组成
      groupId:项目的包名 组织名,公司网址反写+项目名
      artifactId:项目名-模块名(没分模块就是项目名)
      version:项目版本
      SNAPSHOT:快照版本
      packing:打包方式(默认jar)

  2、maven目录结构
       src/main/java             java源码
       src/main/resources        项目配置文件
       src/test/java             测试类
       src/test/resources        测试需要的配置文件
       Maven Dependencies        项目依赖的jar包
       target                    项目打包目录
       pom.xml                   项目对象描述信息

  3、cmd常用命令(都必须在项目根目录下执行)
         删除target目录         mvn clean
         编译项目:              mvn compile
         运行测试用例           mvn test
         打包命令生成jar        mvn package        
   安装jar到本地仓库中          mvn install  

  4、eclipse运行
      项目右键项目run as-->maven builder...
                -->compile(package,test,install)
  

四、坐标和仓库概念
1、坐标
    在maven中,任何的依赖,插件,项目构件的输出都可以称之为构件
    所有的构件都通过坐标作为其唯一的标识,类似于购物时填写的
    电话和地址来找到你

    坐标写法:
        com.lanou.testMaven
        testMaven
        0.0.1-SNAPSHOT

    groupId,artifacteId,version可以构成一个坐标
    groupId:包名.项目名
    artifactId:项目名-模块名
    version:当前项目版本号:一般都是由3个数字表示 
            第一个0:大版本号 
            第二个0:分支版本还号 
            第三个0:小版本号 0.0.1 
             snapshot:快照 
             alpha:内测版本
             beta:公测版本
             release:稳定版本 
             GA:正式发布版本

2、仓库
     用于管理项目中所有的依赖(jar),
     当前项目本身也可以install安装成jar安装到仓库
     提供给其他人进行使用

     1>本地仓库
       用于存储从网络上下载的所有依赖(jar),
       以及可以将项目本身打包成jar,提供给其他人使用
       更改本地仓库位置:settings.xml
       
            D:\apache-maven-3.5.0\repository
       

       
     2>中央仓库:存储着全世界所有的依赖jar
        地址:https://repo.maven.apache.org/maven2

     3>镜像仓库
        因为中央仓库在国外,直接下载比较慢,因此可以一个组织搭建
        一个镜像仓库,从镜像仓库下载

         相当于私服
                 
                maven.net.cn
               
                central
                central mirror in china
                
                http://maven.net.cn/content/groups/public   
       

        
        阿里云镜像:
        
            alimaven
            aliyun maven
            http://maven.aliyun.com/nexus/content/groups/public/
            central
        

                
 
五、maven生命周期(面试重点*****)
1、生命周期
     完整的项目构建过程:clean,compile,test,package,install
     清理->编译->测试->打包->集成测试->验证->部署

     maven生命周期:
     1>clean    清理项目
         1.1>pre-clean 执行清理前的工作
         1.2>clean 清理上一次构件生成的所有文件
         1.3>post-clean 执行清理后的文件   
     2>defaut   构建项目(最核心)
         2.1>compile
         2.2>test
         2.3>package
         2.4>install
     3>site      生成项目站点
        3.1>pre-site 在生成项目站点前要完成的工作
        3.2>site 生成项目的站点文档
        3.3>post-site 在生成项目站点后要完成的工作
        3.4>site-deploy 发布生成的站点到服务器上
      
七、maven依赖范围(面试重点*****)
    1、什么是依赖范围
        规定项目导入的依赖jar在编译 、测试 、运行哪个生命周期范围内有效
    
        2、依赖范围值
    在dependency标签中通过test配置
        scope有6种值:
    http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

    1>compile:默认的范围,编译测试运行都有效

    2>provided:在编译和测试时有效,运行无效
      如:servletapi编译时加入,运行不需要,因为
         容器中有,在加入会报错

    3>runtime:在测试和运行时有效

    4>test:只在测试范围内有效
      如:junit单元测试

    5>system:根provided一样,只在编译和测试有效
      但与本机系统相关联,可移植性差(javahome)

    6>import:导入的依赖范围,它只使用在
        dependencyManagement中,表示从其他的pom中
        导入dependency的配置
    
    如:将A中依赖导入B中
    
      4.0.0
      maven
      B
      pom
      B
      1.0
      
      
        
          
        maven
        A
        1.0
        pom
        import
      

      

八、依赖传递以及排除传递依赖(面试重点*****)
      1、什么是传递依赖
        假如有Maven项目A,项目B依赖A,项目C依赖B。
        那么我们可以说 C依赖A。也就是说,
        依赖的关系为:C—>B—>A。那么我们执行项目C时,
        会自动把B、A都下载导入到C项目的jar包文件夹中。
        这就是依赖的传递性。

        案例:
        山鸡-->南哥   南哥-->B哥   
        那么山鸡-->B哥  传递依赖
    
    创建三个maven project
    1>b哥执行install安装
    2>南哥依赖b哥
    3>南哥执行install安装
    4>删除依赖南哥
    
    此时观察山鸡项目maven Dependencies会发现虽然山鸡
    只依赖于南哥却将b哥也依赖进来了,山鸡可以使用
    exclusions标签排除b哥依赖

    
          com.hongxing
          hongxing-nange
          0.0.1-SNAPSHOT
          
          
              
              
                  com.hongxing
                hongxing-bGe
              

          

      

    
    
九、依赖冲突(面试重点*******)
    1、什么是依赖冲突
      在传递依赖过程中,如果一个项目依赖了两个不同版本的jar,具体以哪个为准
    如:在不排除山鸡传递依赖的前提下,如果B哥依赖了commons-io2.4的版本
        而南哥依赖了commons-io2.0的版本,那么山鸡同时依赖两个,具体版本是哪个

    2、依赖冲突解决方案:(面试重点*******)
    1、短路优先原则
       A->B->C->X(.jar)
       A->D->X(.jar)   优先
    
        B哥依赖commons-io2.4的版本
         路径:山鸡->南哥->B哥->commons-io2.4
        南哥依赖commons-io2.0的版本
         路径:山鸡->南哥->commons2.0
        此时观察山鸡会依赖2.0的版本,因为山鸡离南哥近
    
    2、先声明,先优先
    如果路径相同,则谁先声明,先解析谁
    如:让山鸡同时依赖南哥和B哥
        将山鸡中排除B哥依赖删除掉
       
       此时会发现先引入谁的依赖,那么版本就是谁的
       
十、聚合和继承
    聚合:对多个项目放在一起运行,同时进行安装
    如:聚合B哥,南哥,山鸡三个项目
    创建项目hongxing-parent,打包方式为pom
    聚合三个项目:
    
        ../hongxing-bGe
        ../hongxing-nange
        ../hongxing-shanji
    

    然后执行clean install会发现同时安装三个项目
    
    继承:如果三个子项目都使用了junit
    1、在父项目中定义如下配置:
    
        
        3.8.1
    

    
        
            junit
            junit
            ${junit.version}
        
     
    

    
    2、让三个子项目继承父项目
        
            com.hogxing
            hongxing-parernt
            0.0.1-SNAPSHOT
        

    
        子项目会继承父工程的依赖,子工程中可以不用写groupId和version
        
    3、如果需要在子工程中有选择性的去继承父工程中依赖,
       需要将父工程中依赖写在dependencyManagement标签中,
       子工程需要该依赖可以通过定义groupId和artifactId继承
       父工程中:
        
            
            3.8.1
        

        
            
                
                    junit
                    junit
                    ${junit.version}
                
     
            

        

       
        子工程中:
        
            com.hogxing
            hongxing-parernt
            0.0.1-SNAPSHOT
        

        
        
            
                junit
                junit
            
     
        

        
       
       
十一、将本地自己的jar安装到本地仓库
        以D:\jdbcutil.jar为例:
        1>cmd中切换到D盘
        2>执行命令:
        mvn install:install-file -Dfile=jdbcutil.jar -DgroupId=com.xxx -DartifactId=jdbcutil -Dversion=0.0.1.RELEASE -Dpackaging=jar  
        
 
十二、创建web项目并发布
      1、创建maven项目,打包方式为war,
      2、创建创建后,在project视图下,右键选择
          Deployment...->generate 生成web-inf和web.xml等目录
      3、依赖导入servlet3.1.0版本
      4、需要修改web.xml的版本为3.1      
        
        
      聚合工程:        
      1、可以使用聚合工程将mvc三层分成三个模块,
          3.1>父工程打包方式为pom
          3.2>controller层打包方式war,dao和service两层为jar
          3.3>service依赖dao,controller依赖service
      2、只需要将web模块加入Tomcat执行
      
      
    Tomcat插件:
    
        
          
            org.apache.tomcat.maven
            tomcat7-maven-plugin
            2.2
            
              8888
            

          

        

    

      
   

 

你可能感兴趣的:(Maven,算法,java,maven)