Maven快速上手笔记
之前学习Maven时留下的笔记,在这里做记录以便后续查看
一 Maven仓库的基本概念
对于Maven来说,仓库只分为两类:本地仓库和远程仓库。
当第一次运行maven命令的时候,需要网络连接,因为它需要从网上下载一些文件。那么它从哪里下载呢?它是从Maven默认的远程仓库下载的。这个远程仓库有Maven的核心插件和可供下载的jar文件。
当Maven根据坐标寻找构件的时候,它会首先查看本地仓库,如果本地仓库存在,则直接使用;如果本地没有,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有,Maven就会报错。
远程仓库分为三种:中央仓库,私服,其它仓库。
- 中央仓库是默认配置下,Maven下载jar包的地方。
- 私服是另一种特殊的远程仓库,为了节省带宽时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其它项目使用。
- 一般来说,在maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。当Maven在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库依赖文件。默认情况下,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。
二 Maven仓库地址
查看依赖版本使用情况及groupId等信息 https://mvnrepository.com/
三 配置文件
- 配置本地仓库地址
<localRepository>D:\Program Files\Maven\repository</localRepository>
- 配置下载镜像地址
<mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror></mirrors>
四 解读pom.xml
<!-- project 标签:根标签,表示对当前工程进行配置、管理 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- modelVersion 标签:从Maven2开始就固定是4.0.0 --><!-- 代表当前pom.xml所采用的标签结构 --><modelVersion>4.0.0</modelVersion><!-- 坐标信息 --><!-- groupId 标签:坐标向量之一;代表公司或组织开发的某一个项目 --><groupId>com.atguigu.maven</groupId><!-- artifactId 标签:坐标向量之一;代表项目下的某一个模块 --><artifactId>demo</artifactId><!-- version 标签:坐标向量之一;代表当前模块的版本 --><version>0.0.1-SNAPSHOT</version><!-- packaging 标签:打包方式 --><!-- 取值 jar:生成jar包,说明这是一个java工程 --><!--取值 war:生成war包,说明这是一个web工程 --><!-- 取值pom:说明这个工程是用来管理其它工程的工程 --><packaging>jar<packaging><name>demo</name><!-- properties 标签:在maven中定义属性值 --><properties><!-- 在构建过程中读取源码时使用的字符集 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- dependencies 标签:配置具体依赖信息,可以包含多个dependency子标签 --><dependencies><!-- dependency 标签:配置一个具体的依赖信息 --><dependency><!-- 坐标信息:导入哪个jar包,就配置它的坐标信息即可 --><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- scope 标签:配置当前依赖的范围 --><scope>test</scope></dependency></dependencies>
</project>
五 Maven依赖的基本概念
依赖的基本配置
根元素project下的dependencies可以包含多个dependence元素,以声明多个依赖。每个依赖都应该包含以下元素:
1、groupId,artifactId,version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖
2、Type:依赖的类型,大部分情况下不需要声明。默认值为jar
3、Scope:依赖的范围(compile,test,provided,runtime,system)
- compile:编译依赖范围
如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效
通常使用的第三方框架的jar包这样在项目实际运行时真正要用到的jar包都是以compile范围进行依赖的。比如SSM框架所需jar包 - test:测试依赖范围
使用此依赖范围的Maven依赖,只对于测试calsspath有效,在编译主代码或者运行项目的使用时将无法使用此依赖,典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要
测试过程中使用的jar包,以test范围依赖进来,比如junit - provide:已提供依赖范围
使用此范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)
在开发过程中需要用到的”服务器上的jar包“通常以provide范围依赖进来。比如servlet-api、jsp-api。而这个范围的jar包之所有不在参与部署、不放进war包,就是避免和服务器上已有的同类jar包产生冲突,同时减轻服务器的负担。 - runtime:运行时的依赖范围
使用此依赖范围的Maven环境,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现。项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动 - system:系统依赖范围
该依赖与三种classpath的关系。和provided依赖范围完全一致。但是,使用system范围依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此该谨慎使用
4、Optional:标记依赖是否可选
5、Exclusions:用来排除传递性依赖
其它核心概念
声明周期
1、作用:
为了让构建过程自动化完成,Maven设定了三个生命周期,声明周期中的每一个环节对应构建过程中的一个操作。
2、三个声明周期
- clean
- 作用:清理操作相关
- 环节:pre-clean、clean、post-clean
- Site
- 作用:生成站点相关
- 环节: pre-site、site、post-site、deploy-site
- Default
- 作用:主要构建过程
- 环节: validate、generate-sources、process-sources、generate-resources、process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目main目录下的源代码
process-classes、generate-test-sources、process-test-sources、generate-test-resources、process-test-resources 复制并处理资源文件,至目标测试目录
test-compile 编译测试源代码
process-test-classes、test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
prepare-package、package 接受编译好的代码,打包成可发布的格式,如jar
pre-integration-test、integration-test、post-integeration-test、verify、install 将包安装至本地仓库,以其它项目依赖
deploy将最终的包复制到远程仓库,以让其它开发人员共享;或者部署到服务器上运行
插件和目标
1、插件
Maven的核心程序仅仅负责宏观调度。不做具体工作。具体工作都是由Maven插件完成的。例如:编译就是由maven-compile-plugin-3.1.jar插件来执行的
2、目标
一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应
Default生命周期中有compile和test-compile两个和编译相关的环节,这两个环节对应compile和test-compile两个目标而这两个目标都是由maven-compile-plugin-3.1.jar插件来执行的
