Maven课堂笔记(上)
随着公司的需要,Maven
的运用是进入互联网公司前所必须掌握的技术之一。接下来本文将简要介绍Maven
的特点和工作原理,后续会出下集并围绕在idea
中使用Maven和命令的一系列的实操分享。
1、Maven概述
1.1 Maven简介
Maven
中文意思为“专家“、”内行“的意思,是由Apache(Tomcat也是Apache旗下的项目)下的一个纯Java开源项目。
Maven
是一个项目管理工具,它可以对Java
项目进行构建、依赖管理。其初衷在于让更多的java
工程师开发日常变得更加容易,帮助理解任何基于Java的项目。
1.2 Maven的功能
Maven主要能够进行项目构建和依赖管理。
1.2.1 项目搭建
1.2.1.1 传统项目搭建
以往在前面的项目学习中,以web项目为例子:
- 在
IDEA
创建Web
工程 - 在工程中编写源码,配置相关的配置文件(如需要MySQL连接需要编写
application.properties
相关配置) - 编译源码,其中
Java
源文件会编译成为.class
文件 - 执行单元测试
Junit
- 将工程打包成war包部署并在tomcat之中运行
1.2.1.2 Maven项目构建过程
Maven将项目构建的过程进行标准化,每个阶段使用一个命令完成。
其分为以下部分:
清理:删除以前的编译结果,为重新编译做好准备。
编译:将Java源程序编译为字节码文件。
测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
报告:在每一次测试后以标准的格式记录和展示测试结果。
打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应war包。
安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行
1.2.2 依赖管理
依赖:一个项目可能需要一些第三方的jar包才能够运行,那么说可以认为这个Java项目依赖了第三方jar库。(比如说运行MySQL就需要导入第三方的MySQL数据库连接池,这就是一种Java项目依赖于第三jar库)
承上启下,依赖管理就是对项目所有以来的jar包进行规范化管理。
1.2.2.1 传统项目的依赖管理
传统项目工程要管理所依赖的jar
包完全由人工进行。程序员首先在网上下载jar
包并添加到项目中。
这会出现以下问题:
- 对jar包之间的版本对应问题,会发生版本不匹配的现象
- 网上查找
jar
包不方便,会出现难找或找不到的现象 - jar的引入添加会使得项目工程过大
1.2.2.2 Maven项目的依赖管理
Maven的项目管理所依赖的包不需要手动添加向工程添加jar
包,只需要在pom.xml
添加jar包的坐标,从Maven
仓库中下载jar
运行即可。
使用Maven
依赖管理添加jar
的好处:
- 通过
pom.xml
文件对jar
包的版本进行统一管理,可避免版本冲突。 Maven
团队维护了一个非常全的Maven
仓库,里边包括了当前使用的jar
包,Maven工程可以自动从Maven
仓库下载jar
包,非常方便。
1.3 Maven的特点
- 一步构建:
Maven
对项目构建的过程进行标准化,通过一个命令即可完成构建过程。 - 依赖管理:
Maven
工程不用手动导jar包,通过在pom.xml
中定义坐标从Maven
仓库自动下载,方便且不易出错。 - 跨平台:可在
window、linux
上使用 - 遵循规范开发,提高团队开发工作效率
以上基本上就是Maven的基本介绍,接下来本文将开始对Maven进行安装配置
2、Maven安装
本文主要使用Maven3.3.9
版本为主。点击此处网站大家可自行下载所需要的版本。
2.1 Maven安装
跳过前面的下载环节,现在着重准备安装Maven
。
首先将下载好的Maven
解压到一个不含有中文、空格的目录中。比如我直接放在D盘目录下也是可以的。
安装包解压即可使用。
目录说明:
bin目录: 该目录包含了 mvn 运行的脚本
boot目录: Maven运行需要类加载器
conf目录: 该目录包含了一个非常重要的文件 settings.xml。直接修改该文件,就能在机器上全局地定制 Maven 的行为
lib目录: Maven运行依赖jar包
2.2 配置环境变量
跟配置jdk
的环境变量一样,这里不详细赘余。
打开cmd
输入mvn -v
可检查Maven
是否安装成功。
2.3 修改Maven的配置文件
在conf
下的settings
文件中,修改成自己常用的jdk
版本。比如本文使用的是jdk1.8,就改成如下:
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<Maven.compiler.source>1.8</Maven.compiler.source>
<Maven.compiler.target>1.8</Maven.compiler.target>
<Maven.compiler.compilerVersion>1.8</Maven.compiler.compilerVersion>
</properties>
</profile>
当然,没有在<profile></profile>
下显示任何标签,自己也是可以加上的。
3、Maven的核心概念
3.1 Maven的目录结构
Maven默认约定了一套目录结构,在通过Maven创建了项目以后,项目的目录结构就是以这套目录结构作为模板创建的。
虽然Maven提供了很多的模板,但是基本的目录结构都是固定的。
假设自己创建一个项目叫myFirstMavenProject
的名称,其约定目录如下
Maven约定的目录结构:
myFirstMavenProject
|-- src
|-- |-- main
|-- |-- |-- java —— 项目的源代码所在的目录
com.jpg.entity
com.jpg.dao
|-- |-- |-- resources —— 项目的资源文件所在的目录
|-- |-- |-- webapp —— 如果是web项目,则该目录是web应用源代码所在的目录
|-- |-- |-- |--WEB-INF
|-- |-- |-- |-- |-- web.xml
|-- |-- test
|-- |-- |-- java ——测试代码所在的目录,如JUnit测试类
com.jpg.dao.test
|-- |-- |-- resources ——测试相关的资源文件所在的目录
|-- target —— 项目构建的输出文件,如.class、.jar、.war文件(不需要创建,会自动生成)
|-- pom.xml ——Maven项目核心配置文件,项目的描述文件
3.2 Maven仓库
在Maven
可以将仓库理解成一个位置,一个专门存放项目中以来的第三方库的位置。
3.2.1 maven仓库分类
maven
仓库分为本地仓库和远程仓库。
3.2.1.1 本地仓库
本地仓库相当于一个缓存,在电脑上是一个文件夹。工程第一次需要某种jar
包时,会从远程仓库(互联网)下载并保存到本地仓库中 (在程序员的电脑上),当第二次使用时,不需要去远程仓库下载,会先去本地仓库中找,如果找不到才会去远程仓库上下载。
默认情况下,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/
的仓库目录。
3.2.1.2 远程仓库
远程仓库中分为中央仓服和私服两类。
3.2.1.2.1 中央仓服
中央仓库中的jar包由专业团队(Maven
团队)维护,中央仓库中存放了全世界大多数流行的开源软件的 jar
包,是Maven默认的远程仓库。
要浏览中央仓库的内容,Maven
社区提供了一个URL:http://search.Maven.org/#browse。使用这个仓库,开发人员可以搜索所有可以获取的代码库。
3.2.1.2.2 私服
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。
除了中央仓库和私服,还 有很多其他公开的远程仓库,常见的有java.net Maven
库(http://download.java.net/maven/2/)和jboss Maven
库(http://repository.jboss.com/maven2/)等。
3.2.2 配置本地仓库
前面所说,本地仓库相当于一个缓存并存储在电脑文件夹中。
在Maven
的安装路径下的conf
文件中的setting.xml
文件下添加如下内容:
<!-- 配置本地仓库 -->
<localRepository>D:\repository</localRepository>
注意:自己先新建一个文件夹作为本地仓库,路径不要有中文和非法字符。
3.2.3 配置远程仓库镜像
我们可以选择把国内的阿里云的Maven仓库作为中央仓库镜像,毕竟访问国外的网站速度太慢。
修改 Maven
根目录下的 conf
文件夹中的 settings.xml
文件,在 mirrors
节点上,添加内容如下:
<!-- 配置阿里云镜像 -->
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://Maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<!-- 其中各个标签的含义是:
id:当前镜像的唯一标识
mirrorOf:将哪个远程仓库当做中央仓库镜像,中央仓库的id是central,所以将阿里云的Maven仓库设置为中央仓库镜像时,其值必须设置为central
name:为当前的中央仓库镜像起一个名字,便于开发者阅读
url:阿里云Maven仓库的地址
-->
3.3 Maven核心文件pom.xml
POM( Project Object Model,项目对象模型 ) 是 Maven
工程的基本工作单元,是一个XML
文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等。
执行任务或目标时,Maven
会在当前目录中查找 POM
。它读取 POM
并获取所需的配置信息,然后执行目标。
<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
http://Maven.apache.org/xsd/Maven-4.0.0.xsd">
<!-- Maven模型的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如
com.companyname.project-group,Maven会将该项目打成的jar包放本地路
径:/com/companyname/project-group -->
<groupId>com.jpg.Maven</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>HelloWorld</artifactId>
<!-- 当前项目版本号:同一个项目开发过程中可以发布多个版本,此处标示0.0.1版 -->
<!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号
当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本
-->
<version>0.0.1-snapshot</version>
<!--打包类型,一般有jar、war、pom等-->
<packaging>jar</packaging>
<!-- 名称:可省略 ,常用于 Maven 生成的文档。-->
<name>Hello</name>
<!--项目描述:可省略,常用于 Maven 生成的文档-->
<description > </description>
<!-- 项目依赖构件配置,配置项目依赖构件的坐标 -->
<dependencies>
<!-- 依赖设置 ,可以有多个dependency节点-->
<dependency>
<!-- 依赖组织名称 -->
<groupId>junit</groupId>
<!-- 依赖项目名称 -->
<artifactId>junit</artifactId>
<!-- 依赖版本名称 -->
<version>4.12</version>
<!-- 依赖范围:test包下依赖该设置 -->
<scope>test</scope>
</dependency>
</dependencies>
<!-- 项目构建配置,配置编译、运行插件等。-->
<build>......</build>
</project>
上面的代码介绍取自网站地查找,分享到这里能更好的介绍每一部分所解释的内容。
3.4 Maven坐标
3.4.1 坐标的概念
在平面几何中表示一个点的坐标通常会用以下表示方法:
(
x
,
y
)
(x,y)
(x,y)
这种写法就是平面几何的坐标的表示方法,因为它能在整个平面直角坐标系中唯一标识一个点。而Maven
同理也是为了定位一个唯一可确定的jar
包。
Maven
世界拥有大量构件,我们需要找一个用来唯一标识一个构建的统一规范。拥有了统一规范,就可以把查找工作交给机器。
3.4.2 Maven坐标组成
Maven坐标组成有以下3点:
<dependency>
<!-- 依赖组织名称 -->
<groupId>junit</groupId>
<!-- 依赖项目名称 -->
<artifactId>junit</artifactId>
<!-- 依赖版本名称 -->
<version>4.12</version>
<!-- 依赖范围:test包下依赖该设置 -->
<scope>test</scope>
</dependency>
groupId:定义当前Maven项目组织名称
artifactId:定义实际项目名称
version:定义当前项目的当前版本或者是所依赖的jar包的版本
3.5 Maven生命周期
Maven生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。生命周期可以理解为构建工程的步骤。
3.5.1 Maven三大生命周期
Maven拥有三套相互独立的生命周期,分别是clean、default和site。
clean Lifecycle: 在进行真正的构建之前进行一些清理工作。 mvn clean
default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等。
site Lifecycle: 生成项目报告,站点,发布站点。
3.5.1.1 clean生命周期
顾名思义,clean的目的就是在于清理项目。
每套生命周期都是一组阶段组成。在我们平时命令行中输入的命令总会对应一个特定的阶段。比如说运行mvn clean
,这里的clean
就是Clean
生命周期的一个阶段。有Clean
生命周期,也有clean
阶段。
包含3个阶段:
1.pre-clean 执行一些清理前需要完成的工作
2.clean 清理上一次构建过程中生成的文件,比如编译后的class文件等
3.post-clean 执行一些清理后需要完成的工作
3.5.1.2 default生命周期- 构建项目
所有生命周期中最核心的部分,绝大部分工作都发生在这个生命周期中。
本文中只介绍一些比较重要和常用的阶段:
generate-resources: 产生主代码中的资源在classpath中的包
process-resource: 复制并处理资源文件,至目标目录,准备打包。
compile: 编译项目的主源码.一般来说:编译src/main/java目录下的java文件至项目输出的主classpath目录中
test-compile:编译项目的测试代码,是编译src/test/java目录下的java文件至项目输出的测试
classpath目录中
test:使用单元测试框架运行测试,测试代码不会被打包或部署.
package:打包成可发布的格式
install: 将包安装到Maven本地仓库,供本地其他Maven项目使用
deploy:将最终的包复制到远程仓库,供其他开发人员和Maven项目使用
运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install
的时候,代码会被编译,测试,打包。
此外,Maven
的插件机制是完全依赖Maven
的生命周期的,因此在文章中,理解生命周期至关重要。
3.5.1.3 site生命周期-生成项目站点
目的:建立和发布项目站点。
pre-site 执行一些在生成项目站点之前需要完成的工作.
site 生成项目站点文档
post-site 执行一些在生成项目站点之后需要完成的工作.
site-deploy 将生成的项目站点发布到服务器上
以上是Maven的关于特点,作用,下载安装,仓库介绍和生命周期介绍的基本分享。读者们有什么问题还请多多留言,我会尽量反馈意见并认真修改。