Maven详解

Mavern:

项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。

Maven详解_第1张图片

 

Maven安装:

  1. 访问http://maven.apache.org/download.cgi网址,下载maven安装包。
  2. 解压压缩包,配置环境变量:

此电脑->属性->高级系统设置->环境变量->系统变量->新建

 Maven详解_第2张图片

 

在path变量的变量值后面添加;%MAVEN_HOME%\bin

 Maven详解_第3张图片

 

  1. Window+r,输入mvn -version命令,验证maven是否安装成功
  2. 创建本地仓库的位置,并放入jar包。
  3. 配置本地仓库让maven知道仓库在哪

配置本地仓库

修改settings文件localRepository标签的信息

 Maven详解_第4张图片

 

 

Maven的核心:

  1. 依赖管理:

    a) 对jar包的统一管理。

  1. 项目构建:

    a) 项目完成后对项目进行编译、测试、打包部署。

Maven基本命令

  1. mvn -v:查询Maven版本 
    本命令用于检查maven是否安装成功。 
    Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。
  2. mvn compile:编译 
    Java源文件编译成class文件
  3. mvn test:测试项目 
    执行test目录下的测试用例
  4. mvn package:打包 
    将项目打成jar包
  5. mvn clean:删除target文件夹
  6. mvn install:安装 
    将当前项目放到Maven的本地仓库中。供其他项目使用

什么是Maven仓库?

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

  • 本地仓库 
      Maven本地的Jar包仓库;在程序员的笔记本上。
  • 私服

    在局域网内的一台服务器上。

  • 中央仓库 
     Maven官方提供的远程仓库;在互联网上基本存放了所有的开源jar包,maven团队维护。

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

Maven详解_第5张图片

 

Maven项目标准目录结构

src

  -main
      –bin 脚本库
      –java java源代码文件
      –resources 资源库,会自动复制到classes目录里
      –filters 资源过滤文件
      –assembly 组件的描述配置(如何打包)
      –config 配置文件
      –webapp web应用的目录。WEB-INF、css、js等
  -test
      –java 单元测试java源代码文件
      –resources 测试需要用的资源库
      –filters 测试资源过滤库

 

什么是“坐标”?

在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。 
如下代码中,groupId和artifactId构成了一个Jar包的坐标。

    ch.qos.logback

    logback-classic

    1.1.1

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

传递依赖 与 排除依赖

    

        ch.qos.logback

        logback-classic

    

 

依赖冲突

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

  • 短路优先

本项目——>A.jar——>B.jar——>X.jar

本项目——>C.jar——>X.jar

若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。 
在此时,Maven只会引用引用路径最短的Jar。

  • 声明优先 
    若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。

聚合

  1. 什么是聚合? 
    将多个项目同时运行就称为聚合。
  2. 如何实现聚合? 
    只需在pom中作如下配置即可实现聚合:

    

        ../模块1

        ../模块2

        ../模块3

    

继承

  1. 什么是继承? 
    在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
  2. 如何实现继承?
    • 父pom配置:将需要继承的Jar包的坐标放入标签即可。

 



        

            

                org.apache.shiro

                shiro-spring

                1.2.2

             

        

子pom配置:



    父pom所在项目的groupId

    父pom所在项目的artifactId

    父pom所在项目的版本号

什么是pom?

pom(Project  Object  Model)作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。

 

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

 

     
     
         
        xxx

        
        xxx 

         
        xxx

         
        xxx 
     

     
     4.0.0  

     
    xxx 

     
    xxx 

     
     jar  

     
     1.0-SNAPSHOT  

     
     xxx-maven  

     
     http://maven.apache.org  

     
     A maven project to study maven.  

     
     
         
         
     

     
     
         
         jira  

         
         http://jira.baidu.com/banseon  
     

     
     
         
         

         
         

         
         
             
             
                 
                 

                 
                 

                 
                 

                 
                 

                 
                 

                 
                
Demo [email protected] [email protected] [email protected] http:/hi.baidu.com/banseon/demo/dev/ HELLO WORLD banseon [email protected] Project Manager Architect demo http://hi.baidu.com/xxx No -5 Project Manager Architect No Apache 2 http://www.baidu.com/banseon/LICENSE-2.0.txt repo A business-friendly OSS license scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk http://svn.baidu.com/banseon demo http://www.baidu.com/banseon true/false true/false true/false true/false true/false true/false true/false jdk版本,如: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/ true/false true/false true/false true/false true/false true/false 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 true/false true/false 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 value

Maven传递依赖冲突解决

一、 A依赖于B,B依赖于C(1.1版本);B就是A的直接依赖,C就是A的传递依赖。

导入依赖D,D依赖C(1.2版本)

 

  1. 第一声明者优先原则:
    1. 谁先定义就先用谁的传递依赖。
    2. 路径近者优先原则:
      1. 直接依赖级别高于传递依赖。

二、 排除依赖:

 Maven详解_第6张图片

Maven详解_第7张图片

 

三、 版本锁定(推荐使用)

 Maven详解_第8张图片

 

依赖范围(了解)

添加依赖范围:默认是compile

Provided: 运行部署到tomcat不在需要

 

如果将servlet-api.jar设置为compile,打包后包含serlvet-api.jar,war包部署到tomcat跟tomcat中存在servlet-api.jar包冲突。导致运行失败。

 Maven详解_第9张图片

 

解决:

 Maven详解_第10张图片

Maven详解_第11张图片

 

 

总结:如果使用到tomcat自带jar包,将项目中依赖作用范围设置为:provided,其他可以默认

 

 

传递依赖范围

 Maven详解_第12张图片

 

 

 

私服的搭建

私服的搭建环境

虚拟机:VMware® Workstation 12 Pro 12.5.7 build-5813279

操作系统:windows10

Nexus:2.14.5

Ip:192.168.149.129

子网掩码:255.255.255.0

网关:192.168.149.2

  1. 私服的安装:

a) 访问https://www.sonatype.com/download-oss-sonatype 下载nexus安装包 

Maven详解_第13张图片

b) 解压压缩包内的文件到指定目录,打开cmd进入nexus的bin目录,执行nexus install命令

Maven详解_第14张图片

 

c) 执行nexus start命令,启动nexus服务

Maven详解_第15张图片

 

d) 找到私服访问的url:http://localhost:8081/nexus/#welcome

 Maven详解_第16张图片

 

私服页面:

默认用户名/密码:admin/admin123

Maven详解_第17张图片

 

  1. 私服仓库类型:

    Maven详解_第18张图片

hosted:宿主仓库

  存放本公司开发的jar包(正式版本、测试版本、第三方:存在版权问题--Oracle)

proxy:代理仓库

  代理中央仓库、Apache下测试版本的jar包

group:组仓库

  将来连接组仓库。包含Hosted:宿主仓库,Proxy:代理仓库

上传jar包到私服:

a) 在maven目录下conf/settings.xml文件总servers标签下,认证:配置用户名密码

 Maven详解_第19张图片

 

b) 在pom.xml文件中配置jar包上传路径url

 Maven详解_第20张图片

 

c) 执行命令发布项目到私服

项目名称右键 --> Run As --> Maven Build…

 Maven详解_第21张图片

 

从私服下载jar包到本地仓库

  1. 在maven目录下conf/settings.xml文件的profiles标签下配置如下。
   



   dev   

       

        

  

        nexus   



          http://192.168.149.129:8081/nexus/content/groups/public/   



           

          true   

           



           

          true   

           

         

      

   

   

          

   

            public  

            Public Repositories  

            http://192.168.149.129:8081/nexus/content/groups/public/  

          

      

 
  1. 激活模板

 Maven详解_第22张图片

 

远程中央仓库aliyun镜像配置

Maven官方的中央仓库服务器在国外,下载速度很慢,有时网络还会卡掉,所以远程中央仓库采取阿里云镜像,在conf/settings文件的mirrors标签下设置如下内容:



  alimaven

  aliyun maven

  http://maven.aliyun.com/nexus/content/groups/public/

  central

Nexus创建仓库以及权限管理

一、 Nexus预定义用户的权限讲解

a) admin用户拥有对Nexus服务的完全控制,默认密码为 admin123。

 Maven详解_第23张图片

 

b) deployment:该用户能够访问Nexus,浏览仓库、搜索,并且上传部署构件,但无法对Nexus进行任何配置,默认密码为 deployment123

 Maven详解_第24张图片

 

c) anonymous:该用户对应了所有未登录的匿名用户,可以浏览仓库并搜索,以下为anonymous用户的角色树,此用户没有浏览器登录功能。

 Maven详解_第25张图片

 

d) Nexus 预定义了一些常用且重要的角色:

  • UI:Basic UI Privileges:包含了访问Nexus界面必须的最基本权限
  • UI:Repository Browser:包含了浏览仓库页面所需要的权限
  • UI:Search:包含了访问快速搜索页面说需要的权限
  • Repo:All Repositoryies(Read):给予用户读取所有仓库内容的权限,没有仓库的读权限用户将无法在仓库页面上看到实际的仓库内容,也无法使用Maven从仓库下载构件
  • Repo:All Repositoryies(Full Control):给予用户完全控制所有仓库内容的权限。

在3.x版本中Nexus只预定义了两个重要角色的内容

  • nx-admin:拥有Nexus所有权限
  • nx-anonymous:匿名用户角色,拥有访问Nexus界面,浏览仓库内容和搜索构件的功能。

私服项目仓库管理实例

一、 为项目创建jar包的发布版仓库和快照版仓库

 Maven详解_第26张图片

Maven详解_第27张图片

 

二、 为项目仓库建立权限

 Maven详解_第28张图片

 

Maven详解_第29张图片

 

创建成功后我们在特权列表中可以看见

 Maven详解_第30张图片

 

三、 针对创建的特权建立相应的角色

 Maven详解_第31张图片

 

四、 创建用户,并指定拥有上述权限的用户

 Maven详解_第32张图片

 

聚合的意义:

  对于一个大型的项目,如果我们直接作为一个工程开发,由于相互之间的依赖我们只能从头到尾由一组人开发,否则就会出现一个类好多人开发,相互更改的混乱局面,这个时候我们就将项目进行了横向和纵向的拆分。

  所谓的横向的拆分就是我们平常说的三层架构,将项目分成了web层,service层、dao层(web层也被叫做表现层,service层也被叫做业务层,dao层也被持久层),可以理解为将一个功能模块的不同调用过程进行了水平方向的拆分。

  所谓的纵向拆分就是将一个项目的多个功能模块进行了,可以理解为为了完成一个系统,深度(纵向)分析需要有哪些功能,然后将这些功能独立出来,进行了(纵向)拆分。

  横向拆分后,每个功能模块进行了单独的开发之后,项目整合的时候就需要有一个能够整合这些项目或者模块的工程,这就是所谓聚合工程的意义。

 

修改maven的默认jdk版本:

  1、在settings.xml文件中更改:

    
    jdk-1.8    
         
          true    
          1.8    
          
        
        1.8    
        1.8    
 1.8    
        
   

 2、在项目中pom.xml文件中制定jdk:

  
          
              
                org.apache.maven.plugins  
                maven-compiler-plugin  
                3.1  
                  
                    1.8  
                    1.8  
                  
              
          
    

 

你可能感兴趣的:(maven)