Maven详细笔记

初识Maven

翻译为“专家”,“内行”(在这指项目构建专家)

Maven是Apache基金会下一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理

跨平台:可以再Windows、Linux、Mac os等系统上运行

Maven的最大作用就是构建项目。

什么是构建

Maven详细笔记_第1张图片

Maven的作用

1.创建项目——创建的项目具有统一的项目结构

2.引入依赖的jar文件——jar包会存放在仓库中

3.打包发布项目——可以将项目打包成开发人员指定的类型,用于部署到Web容器。还可以将项目打包到仓库中,方便项目的相互依赖。

Maven模型

 Maven详细笔记_第2张图片

1.项目对象模型(Project Object Model):通过 pom.xml 描述项目基本信息,并加载项目 

2.依赖管理模型(Dependency):管理jar包以及jar包之间的依赖,需要什么jar包只要在pom.xml文件中配置就可以,Maven会自动下载到本地jar包仓库中(从central(中央仓库)、b2b(私服仓库)、local(本地仓库)仓库中下载)

3.Build lifecycle  phases:Maven 构建项目的整个生命周期过程是由一个一个插件完成的。每个插件完成一个特殊的功能,并产出一些文件。

Maven的运行依赖于生命周期中的每一个阶段,每一个阶段都对应一个或多个插件,每个插件执行一个功能。

Maven的仓库

 Maven详细笔记_第3张图片

本地仓库

Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。

运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。

远程仓库——Nexus私服

私服也属于远程仓库的一种,只是这个远程仓库的地址是本地服务器而已

配置在局域网环境中,为局域网中所有开发人员提供jar包的统一管理

本地仓库(本机)--->私服(局域网)--->中心仓库(外部网络)

远程仓库——其他公共库

一些知名公司将收集的依赖构建而成的仓库,并将仓库地址发布到网络中提供其他用户使用。比如阿里巴巴的公共库

远程仓库——中央仓库

由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令时下载到需要的构件。中央仓库就是一个默认的远程仓库。Maven的安装文件默认带了中央仓库的配置

maven自己的中央库访问速度很慢

公司开发的自己的jar包等其他代码源,不想公开分享,就只有放到私有服务器上存放

有的jar包或者代码源中央库没有的,或者使用得老版本中央库没有的,我们需要私有服务器存放这些数据,用到的时候下载的速度也会很快

在Maven项目中都包含一个pom.xml文件,在该文件中通过配置依赖的坐标,Maven项目就会去仓库中查找并引入所需要的依赖。

库优先级:本地→私服→其他公共仓库→中央仓库

 Maven详细笔记_第4张图片

Maven的安装(Windows) 

1.确认jdk是否已安装?(maven3.3以上的版本要求JDK最低为1.7)

echo %JAVA_HOME%

java -version

javac

2.下载maven网址:Maven – Download Apache Maven    

3.对下载的apache-maven-3.6.1-bin.zip进行解压,解压到硬盘目录(解压目录最好不要有中文字)即可完成maven的安装

4.配置环境变量

MAVEN_HOME------->其值为maven安装的路径

Maven详细笔记_第5张图片

path------->其值为maven安装的路径\bin

Maven详细笔记_第6张图片 

5.在dos窗口中运行命令mvn -v或mvn -version,显示如图所示的内容证明安装成功了。 

Maven详细笔记_第7张图片 

Maven安装目录分析 

Maven详细笔记_第8张图片

bin:含有mvn运行的脚本(二进制可运行指令)

boot:含有plexus-classworlds类加载器框架(java语言在加载的时候有一个类加载器,Maven有自己的专用的类加载器,jdk类加载器将Maven类加载,Maven再启动自己的类加载器加载其它Maven类)

conf:含有settings.xml配置文件

lib:含有Maven运行时所需要的java类库(Maven本身是用Java写的,它的运行需要一些资源jar包)

LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍

 Maven的配置

Maven的主要功能之一是管理构建项目所需要的jar文件,那么从哪里下载,下载到哪里就成为必须要解决的问题,Maven使用settings.xml指定这些配置信息。

默认仓库——当前用户路径C:\Users\[UserName]\.m2

全局范围:Maven安装目录,如:D:\ruanjian\apache-maven-3.6.1\conf\settings.xml,对所有用户均有效。

修改默认仓库的位置本地仓库的位置

用户范围:当前用户目录,如D:\ruanjian\maven\settings.xml,仅对当前用户生效。

两个目录都可以出现settings.xml,最后取合并后的结果,如果存在重复定义,那么当前用户目录的配置项优先生效。通常是把全局范围内的settings.xml作为模板复制到用户范围目录中。

settings.xml使用仓库来管理jar文件的下载,分为本地仓库远程仓库,分别使用下面的两个节点配置:

Maven详细笔记_第9张图片

https://blog.csdn.net/qidasheng2012/article/details/78152581

注意:用户级别的仓库在全局配置中一旦设置,全局配置将不再生效,转用用户所设置的仓库,否则使用默认路径仓库

 在IDEA中配置Maven

Maven详细笔记_第10张图片

在IDEA中构建Maven项目

1.创建maven项目

 Maven详细笔记_第11张图片

2.设置项目的maven坐标

Maven详细笔记_第12张图片 

3.设置maven项目的属性

Maven详细笔记_第13张图片 

Maven详细笔记_第14张图片 

Maven项目的标准目录结构

src/main/java —— 存放项目的.java文件

src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件

src/main/webapp—— Web项目根目录

src/test/java —— 存放所有测试.java文件,如JUnit测试类

src/test/resources —— 测试资源文件

target —— 项目编译构建的输出位置(可以自动生成)

pom.xml——maven项目核心配置文件

案例:

详见第1个Maven项目.txt

一个项目依赖另一个项目 

详见第2个Maven项目.txt(依赖1)

详见第3个Maven项目.txt(依赖1、2)

第一次执行maven命令时,会自动下载相应的maven插件,插件会被下载到maven仓库中

仓库位置:仓库路径\repository\org\apache\maven

断网后下载失败,再次连接无法下载的解决方案。

删掉仓库中对应资源文件夹下的xxx.pom.lastUpdated文件后,修复网络重新下载

POM文件 

Maven核心概念
坐标、依赖管理、仓库管理、生命周期、插件和目标、聚合继承

Maven坐标

什么是坐标?

在平面几何中坐标(x,y)可以标识平面中唯一的一点

Maven坐标主要组成

:项目组织的唯一标识,通常由域名倒写,如com.company,对应Java包的结构

:项目唯一标识,对应项目名称

:定义当前项目的当前版本,如1.0.0-SNAPSHOT、1.0.0-RELEASE,1.0.0表示版本号,SNAPSHOT表示快照版,RELEASE表示发行版

:项目的打包方式,一般为 jar 或者 war(默认值是jar,代表Maven会将项目打成一个jar包)

Maven为什么使用坐标?

Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范

拥有了统一规范,就可以把查找工作交给机器

http://mvnrepository.com/ 

pom文件中的其他标签

:POM文件的顶级元素

:POM模型版本,描述这个POM文件是遵循哪个POM版本

:表示父依赖,类似Java中的继承,当前项目可继承父依赖中配置的依赖和属性

需要指定父依赖的groupId、artifactId、version和relativePath(relativePath父项目的pom.xml文件的相对路径)

>:项目的名称,在Maven生成的文档中使用

>:项目主页的URL,在Maven生成的文档中使用

>:项目的描述,在Maven生成的文档中使用

>:定义此项目的依赖关系集,在子节点dependency中添加具体的依赖

<dependency>:dependencies的子节点,定义引入某个依赖。

详细见 dependency标签_疙瘩陈的博客-CSDN博客_dependency标签   



    org.apache.commons
    commons-lang3
    3.3.2
    
    compile
    
    ./commons-lang3.jar
    
    false
    
    
        
            aopalliance
            aopalliance
        
    



<properties>:定义一些常量,可在pom文件的其他地方引用



    

    UTF-8

  

:构建选项,描述如何编译和打包项目,具体工作通过build标签下中的plugin完成。plugin不是必须的。

Maven详细笔记_第15张图片


  

    mavenmodule  

      

          

              

              maven-compiler-plugin  

              3.1.0  

              

          

      

  

 

Maven生命周期

何为生命周期?

生命周期是指一个事物从创建到消亡的整体过程

Maven生命周期指Maven整体的构建过程

生命周期Maven有三套相互独立的生命周期: 

Clean Lifecycle 在进行真正的构建之前进行一些清理工作 

Default Lifecycle 构建的核心部分,编译,测试,打包,部署等。 

Site Lifecycle 生成项目报告,站点,发布站点 

再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

Maven Core – Lifecycles Reference

Maven详细笔记_第16张图片

IDEA中的常用Maven操作 

首先需要在idea中对maven进行集成,目录为File---->Setting---->Build、Execution、Deployment---->Build Tools---->maven,

集成了Maven之后,也集成了对maven命令的图形化操作。再idea中通过菜单View->Tool Windows->Maven,打开Maven操作的界面:

Maven详细笔记_第17张图片

在IDEA中开启热部署

修改代码后,不需要重启项目,就可以更新部署

IDEA默认没有开启热部署,开启步骤如下

1.使用组合键 Ctrl+shift+alt+/ 打开Maintenance窗口,选择“1.Registry…”

Maven详细笔记_第18张图片

2.勾选 compiler.automake.allow.when.app.running

Maven详细笔记_第19张图片 

3.在pom.xml中添加依赖

 

      org.springframework.boot

      spring-boot-devtools

      true

    

 4.在pom.xml中配置plugin

  

        

          org.springframework.boot

          spring-boot-maven-plugin

          

            true

          

          

            

              org.springframework

              springloaded

              1.2.5.RELEASE

            

          

        

      

5.在idea中,单击File--->Setting,在打开的窗口中单击“Build、Execution、Deployment”--->compiler,在弹出的窗口中勾选“build project automatically”选项。

Maven详细笔记_第20张图片

在IDEA中使用maven创建ssm框架项目

(将之前的写好的ssm学生项目改造为maven项目) 

Maven详细笔记_第21张图片

1.创建maven-web项目

2.创建目录结构

src/main/java 指定为Sources Root

src/main/resources 指定为Resources Root

3.配置pom.xml,引入ssm框架需要的jar包+mysql驱动jar+jstl/el+数据校验+log4j+junit等等jar包




    UTF-8

    1.7

    1.7

    5.2.2.RELEASE

  

  

    

    

      org.springframework

     spring-core

      ${spring.version}

    

    

      org.springframework

      spring-aop

      ${spring.version}

    

    

      org.springframework

      spring-web

      ${spring.version}

    

    

      org.springframework

      spring-webmvc

      ${spring.version}

    

    

      org.springframework

      spring-jdbc

      ${spring.version}

    

    

      org.springframework

      spring-tx

      ${spring.version}

    

    

    

      aopalliance

      aopalliance

      1.0

    

    

      org.aspectj

      aspectjweaver

      1.6.9

    

    

    

      org.mybatis

      mybatis

     3.5.1

    

    

    

      mysql

      mysql-connector-java

      8.0.19

    

    

    

     commons-dbcp

      commons-dbcp

      1.4

    

    

    

      org.mybatis

      mybatis-spring

      2.0.3

    

    

    

      javax.servlet

      jstl

      1.2

    

    

      taglibs

      standard

      1.1.2

    

    

    

      log4j

      log4j

      1.2.17

    

    

    

      junit

      junit

      4.12

      test

    

    

    

      com.alibaba

      fastjson

      1.2.13

    

    

    

      org.hibernate

      hibernate-validator

      5.1.0.Final

    

    

      javax.el

      javax.el-api

     3.0.0

    

    

    

      commons-fileupload

      commons-fileupload

      1.2.2

    

    

      commons-io

      commons-io

      2.4

    

    

    

      javax.servlet

      javax.servlet-api

      3.1.0

      provided

    

  


4.将学生项目中xml的内容复制到web.xml中,注意这里面的节点有顺序要求






  Archetype Created Web Application

  

  

    contextConfigLocation

    classpath:ApplicationContext-*.xml

  

  

  

    encodingFilter

    org.springframework.web.filter.CharacterEncodingFilter

    

      encoding

      UTF-8

    

    

      forceEncoding

      true

    

  

  

    encodingFilter

    /*

  

  

  

    org.springframework.web.context.ContextLoaderListener

  

  

  

    springmvc

    org.springframework.web.servlet.DispatcherServlet


    

    

      contextConfigLocation

      classpath:springmvc-servlet.xml

    

  

  

    springmvc

    /

  

  

  

    

  


5.将学生项目中src下的包及java代码还有映射文件一并赋值到现在的src/main/java下

这里需要注意mapper的映射文件由于在src下,是无法加载到的,可以在pom.xml中配置



    

      

        src/main/java

        

          **/*.properties

          **/*.xml

        

        false

      

      

        src/main/resources

        

          **/*.properties

          **/*.xml

        

        false

      

    

6.将学生项目中的配置文件复制到src/main/resources下

7.根据配置文件中指定的静态文件路径,在webapp下创建对应的文件夹用于存放静态文件,这里我配置的是statics

8.将学生项目中的页面复制到WEB-INF下

这里需要注意如果页面无法识别el表达式,可以设置page指令,开启

<%@ page isELIgnored="false"%>

初识maven私服Nexus

为何需要私服

实际开发中,通过中央仓库获取构件往往存在各种问题

网速慢,下载时间长,效率低

多人重复下载,浪费带宽,且版本可能不一致

不利于公共构件的管理和维护

第三方构件未在中央仓库发布,或更新不及时

搭建Maven私服

局域网内下载速度优于远程仓库,节约带宽

版本统一

可自行进行构件的管理和维护(项目模块所依赖的公共构件、第三方构件)

Maven详细笔记_第22张图片

 

常见Maven私服

Apache Archiva

Artifactory

Sonatype Nexus

强大的Maven仓库管理器

使用文件系统 + Lucene来组织数据 

bundle版安装包内嵌Jetty容器

Nexus专业版是需要付费的,这里我们下载开源的Nexus OSS

一、Nexus的下载和安装 

1.首先确定我们的环境安装好maven,jdk等必须的环境;jdk:要1.6版本以上。

echo %JAVA_HOME%

java -version

echo %MAVEN_HOME%

mvn -version

2.这些都准备好之后,下载nexus ,下载地址:http://www.sonatype.org/nexus/go 

3.打开目录nexus-2.x.x-xx-bundle\nexus-x.x.x-xx\bin\jsw 这个目录下面你会发现有很多系统版本的nexus环境,根据个人的电脑系统选择对应的版本:例如win7 (64)位的系统,选择windows-x86-64这个版本

Maven详细笔记_第23张图片

4.打开一个版本你会看到如下文件:

Maven详细笔记_第24张图片 console-nexus.bat:启动nexus服务器,命令行窗口,关闭后,不会驻留在windows服务中

install-nexus.bat:将nexus安装成为windows服务

start-nexus.bat:启动服务

stop-nexus.bat:停止服务

uninstall-nexus.bat:卸载nexus在windows中的服务

5.启动服务,访问http://localhost:8081/nexus/ 启动后如下页面,在右上角有个Log in 的超链接,点击登录

默认的用户名是 admin 密码是 admin123

Maven详细笔记_第25张图片

私服默认的端口号为8081;如何修改端口号? 

找到你的nexus的所在目录,打开nexus根目录下的conf文件夹下的配置文件nexus.properties,打开文件找到大约第19行application-port=8081;修改为自己所需要的端口号即可

6.登录之后,可以点右上角的“admin -> Profile”可修改登录密码

Maven详细笔记_第26张图片

7.私服的仓库说明

点击左侧Views/Repositories 中Repositories

Maven详细笔记_第27张图片 

Repository——Nexus内置仓库说明:

 1) Public Repositories:该仓库组将上述某些仓库聚合(可在仓库的Configuration中配置)并通过一致的地址提供服务

2) 3rd party:用来部署无法从公共仓库获得的第三方发布版本的jar包

3) Apache Snapshots:用来代理Apache Maven仓库的快照版本jar包

4) Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本jar包

5) Central M1 shadow: 用于提供中央仓库中M1格式的发布版本的组件镜像仓库

6) Releases:用户部署组织内部的发布版本的jar包

7) Snapshots:用来部署组织内部的快照版本的jar包

Type——仓库类型说明:

1) group:仓库组,用来合并多个hosted/proxy仓库,通常我们配置maven依赖仓库组

2) hosted:本地仓库,通常我们会部署自己的构件到这一类型的仓库。 包括3rd party仓库,Releases仓库,Snapshots仓库

3) Proxy:代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库

4) virtual:虚拟仓库

Format——2中仓库格式:maven1、maven2

Policy——2中仓库版本策略:

snapshot:快照版本,相对不稳定

release:发行版本,即稳定版本

Repository Path——仓库访问地址 

8.设置下载远程索引到本地

 Maven详细笔记_第28张图片

9.然后在Central仓库上右键然后点击Repair Index 即可下载中心仓库的索引文件,稍等几分钟点击下边的Browse Index即可看见下载的索引文件。

Maven详细笔记_第29张图片 

一般远程仓库比较大,构件较多,索引文件会很大;由于因特网宽带的限制,我们不推荐在线方式,强烈推荐使用本地方式。

下载索引相关文件及索引构建工具

从 Central Repository: .index 下载索引相关文件

 nexus-maven-repository-index.gz 

nexus-maven-repository-index.properties 

从 Central Repository: org/apache/maven/indexer/indexer-cli/5.1.0 下载Maven索引构建工具indexer-cli-5.1.0.jar

停止Nexus服务;使用索引构建工具解压索引文件,将下载的三个文件放置在同一目录下

 Maven详细笔记_第30张图片

 执行命令:java -jar indexer-cli-5.1.0.jar -u nexus-maven-repository-index.gz -d indexerMaven详细笔记_第31张图片

 

清空D:\ruanjian\nexus-2.14.1-01-bundle\sonatype-work\nexus\indexer\central-ctx中的文件,

将解压生成的indexer目录中的索引文件全部移动到索引目录D:\ruanjian\nexus-2.14.1-01-bundle\sonatype-work\nexus\indexer\central-ctx中。

Maven详细笔记_第32张图片

10.这样设置以后,重新启动Nexus,访问Nexus管理页面,在Browse Index选项卡点击刷新按钮即可显示更新后的索引

Maven详细笔记_第33张图片 

可以在左边菜单栏里面找到Artifact Search,在输入框里面输入你想要搜索的组件名字,比如:hibernate, 那么查询结果如下:

Maven详细笔记_第34张图片 

11.点击其中一个版本的信息,可以查看pom信息

Maven详细笔记_第35张图片  

二、配置从私服下载资源

1.在本地仓库的settings.xml文件中配置,在中添加

 

配置的是组 ,当前的组中有

   

   

       

       nexus

       *

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

     


2.修改项目pom文件,设置下载仓库(repository),代码如下:在标签下添加

 

    

      public

      Team Maven Repository

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

      

        true

      

      

        true

      

    

  

 3.这时就可以使用在项目中私服下载所需资源了,查找私服dependency配置信息,从私服上搜索自己想要的jar包,然后将依赖拷贝到 pom.xml中,项目会自动更新;但是由于私服中的访问的远程仓库是中央仓库,访问下载时间较长,所以建议在私服上添加阿里代理仓库

Maven详细笔记_第36张图片

3.1输入名称和地址

Maven详细笔记_第37张图片 

3.2保存完毕后可能出现这种情况    in service - Remote Automatically Blocked and Unavailable(远程自动阻止和不可用) 

 Maven详细笔记_第38张图片

 3.3修改方法是:把Auto Blocking Enabled   修改为 false

Maven详细笔记_第39张图片

3.4修改后的样子

Maven详细笔记_第40张图片 

3.5把新添加的仓库 添加到组仓库并调整位置 

 Maven详细笔记_第41张图片

 

3.6这样通过私服下载 jar时 阿里镜像仓库会优先中央仓库下载,提高速度。

演示:

将mysql8.0.20版本的信息dependency复制到pom文件

Maven详细笔记_第42张图片 

这时下载该版本的jar文件的路径为私服路径,切记要联网(之后再下载同版本的jar就不需要联网了)

Maven详细笔记_第43张图片 

三、配置将资源发布到私服 

1.在项目的pom.xml中配置发布目的地,在标签下添加

 

        

            releases

            http://localhost:8081/nexus/content/repositories/releases/

        

        

            snapshots

            http://localhost:8081/nexus/content/repositories/snapshots/

        

    

 2.在本地仓库的settings.xml文件中配置发布权限,在中添加

 

      releases

      admin

      admin123

    

    

       snapshots

       admin

       admin123

    

演示:

编写一个项目maven05_sifu,在项目中写一个方法;在IDEA中,通过maven操作中的deploy,可以上传war(maven-java就是jar)到Nexus私服仓库

Maven详细笔记_第44张图片这样其他的项目就可以通过引用该项目的dependency信息,使用此项目中的代码了

注意:私服一般安装在内网的其他服务器上,而不是本机上。因此上面的配置中localhost的部分在实际情况中应该修改为公司中内网的私服服务器地址。 

 手工上传第三方构件到私服3rd party仓库

1.下载oracle jdbc jar包或者安装oracle,从oracle的安装目录中找到jar包;安装目录:\oracle\product\10.2.0\db_1\jdbc\lib\jar:ojdbc14.jar

2.在Nexus中配置:

Maven详细笔记_第45张图片

 添加后如下图所示,点击“update Artifact(s)”:

Maven详细笔记_第46张图片

 4.配置完成后就可以引入oracle的jar包了

Maven详细笔记_第47张图片

Maven详细笔记_第48张图片 

 

 

 

 

你可能感兴趣的:(maven,java,spring,boot)