一. 何为Maven
项目构建工具,抽象了构建生命周期,不必再去定义构建过程,像一个简单的maven install命令后对应着编译、测试、打包等动作
依赖管理工具,通过一个坐标系统(groupId, artifactId, version)准确定位到每一个构件(artifact),即可以根据一个坐标定位到任何一个jar文件
maven为全世界提供了免费的中央库,可以在这这个中央库找到绝大部分流行的开源类库。
对比:Ant
Ant(Another Neat Tool),含义是“另一个整洁的工具”
Ant使用XML定义构建脚本,有一个build.xml文件,在build.xml里定义构建过程(指定编译、打包等)
Ant需要开发者显式地指定每一个目标,以及完成该目标所需要执行的任务,针对每个项目都要写一遍
Ant没有依赖管理, 需要手工管理依赖,这点非常致命,特别是在多人参与的项目里很艰难
二. maven安装(Windows环境)
1. 下载地址:http://maven.apache.org/download.cgi
可以下载apache-maven-3.5.3-bin.zip,然后解压,我解压后的位置是:G:study oolsapache-maven-3.5.3
2. 环境变量配置
新建个变量名为M2_HOME,值为G:study oolsapache-maven-3.5.3
再在path里添加:%M2_HOME%in;
确定后,到命令窗口确认是否安装成功:mvn -v
三. maven安装目录解析
1. bin
包含了mvn运行的脚本
2. conf
包含一个非常重要的文件:settings.xml
settings.xml是当前maven环境的全局配置文件
一般情况下,我们会把settings.xml复制到~/m2/目录下(~/表示用户目录),然后修改这个目录下的settings.xml,在用户范围控制maven配置
如我的目录就是:C:Usersconglin.m2
3. ~/.m2/目录,这个目录不是安装目录,在我们安装maven后,任何一个涉及到下载jar(或其他依赖构件)的mvn命令都会默认在用户目录下生成/.m2
其中/.m2 epository/就是存放着我们构件项目时从远程库下载到本地的依赖构件
四. maven项目核心文件——pom.xml
pom(Project Object Model,项目对象模型),定义了项目的基础信息,用于描述项目如何构建以及声明项目依赖等。
如下是我在创建一个Spring boot项目demo时的pom.xml,其中<!-- -->是我添加用于描述标签含义的备注
<?xml version="1.0" encoding="UTF-8"?> <!-- xml标签指定xml文档版本和编码 --> <!-- project是pom.xml的根元素 --> <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"> <!-- modelVersion指定了当前POM模型的版本,对于maven2和maven3来说,值只能是4.0.0 --> <modelVersion>4.0.0</modelVersion> <!-- groupId,artifactId,version这三个元素定义了当前项目的基本坐标 其中, groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联 artifactId定义了当前项目组在组中唯一的id version表示当前项目的版本,SNAPSHOT表明当前项目还在开发过程中,是不稳定的快照版本 --> <groupId>com.example</groupId> <artifactId>fuck</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- packaging指定打包类型,没指定时默认是jar --> <packaging>jar</packaging> <!-- 是项目更具可读性的名称,非必须 --> <name>fuck</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
其实在我们想通了maven的存在的意义后,对于pom.xml中陌生的标签,完全通过实时上网查询资料来了解,
只要清楚各种标签最终都体现在几种用途:打包说明、依赖说明、项目说明等
五. 仓库——repository
Maven可以在某个位置统一存储所有maven项目共享的构件,而这个统一的位置就是仓库。
对于maven来说,仓库只分为两类:本地仓库和远程仓库。当maven根据坐标寻找构件时,首先查询本地仓库,本地仓库没有时再查询远程仓库,当两者都没有时就会报错。
1. 本地仓库
在Windows环境下,本地仓库通常默认为~.m epository
而当前用户的目录往往在C盘中,在C盘硬盘容量不够时,我们可以在setting.xml的localRepository标签里设置
如
<localRepository>D:maven epo</localRepository>
2. 远程仓库
远程仓库往往被细分为三大类:中央仓库、私服、其他公开的远程仓库
其中,私服几乎是所有公司都会有!
私服详情可见稍后出的【Nexus maven私服记】
六. mvn clean install
我们在打包项目时,最常用的命令就是
mvn clean install
然而mvn clean install的背后还经历了啥?
执行mvn clean install命令时,相当于后台还依次执行了如下命令的动作:
mvn clean compile mvn clean test mvn clean package mvn clean install
//注:以上命令依次从上往下,当执行下边的命令时,自动调用执行上边的命令动作;clean指定了清除项目的/target目录,clean并非必要的参数
即执行mvn clean install命令时,先后进行了编译、测试、打包,最后还将打包出来的该项目安装到本地仓库,以供其他maven项目使用
所以当我们被问maven的打包命令时,可以说是mvn install,但严格来说应该是mvn package
说明:本博客内容绝大部分摘抄于【Maven实战 第一版 许晓斌 机械工业出版社】,本文仅供个人学习,禁止任何形式的转载!