typora-copy-images-to: img
maven
一、maven概述
1.1、项目开发中的问题
在之前中的项目中,我们大量导入jar包, 这会导致如下的问题:
- 造成包的冗余:每个项目需要复制一次这些包,占用大量的空间。
- 不易管理:不同的开发者使用的jar包的版本不同,导致包不统一,甚至出现包的冲突。
- 阅读性差 : 应该导入哪些jar包,这些包又依赖了哪些包并不清楚。
2.1、maven是什么
2.1.1 maven定义
Apache Maven是一个软件,项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。
maven:本质上是一个管理项目的软件 maven是Apache出品, 也是用java写的
2.2.1 maven的作用
- 项目构建管理: maven提供一套对项目生命周期管理的标准,开发人员、和测试人员统一使用maven进行项目构建。项目生命周期管理:编译、测试、打包、部署、运行。
- 管理依赖(jar包): maven能够帮我们统一管理项目开发中需要的jar包;
- 管理插件: maven能够帮我们统一管理项目开发过程中需要的插件;
二、maven快速入门
2.1、maven的下载与安装
下载
官方网站:http://maven.apache.org/
下载页面:http://maven.apache.org/download.cgi
注:本教程使用的是3.6.3版本的maven。
3.3以上到3.6.3都可以
安装
maven安装包下载完成后是一个压缩文件,如下图所示:
我们需要将压缩包解压到一个没有中文,空格或其他特殊字符的文件夹内即可使用:
2.2、maven安装目录简介
2.3、maven配置-环境变量
2.3.1 配置JAVA_HOME
3.3以上版本的maven软件依赖1.7或以上版本的JDK,所以安装maven之前需要确认jdk的版本和JAVA_HOME是否正确配置:
Path
注意:JAVA_HOME路径需要设置成bin目录的上一级目录;
2.3.2配置MAVEN_HOME
按照上面JAVA_HOME的配置方式,将maven的安装目录配置到环境变量中。MAVEN_HOME=maven压缩包解压目录。
备注: 这里截图的maven版本是3.5.3, 版本3.6.3也是一样的
第一步:新增环境变量:MAVEN_HOME
第二步:在path环境变量中添加:%MAVEN_HOME%\bin;
第三步:测试:在cmd控制台中输入命令: mvn -v ;如果出现以下maven的版本信息,则说明maven的安装与环境变量的配置均正确;
# maven安装回顾
1. 解压 maven的压缩包,注意路径中不要有中文
2. 配置java_home: maven是用java编写的,运行需要jdk
3. 配置maven_home : 之后要使用maven的命令
2.4、maven仓库配置
maven的仓库可以分为3种:
仓库名称 | 作用 |
---|---|
本地仓库 | 相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找。 |
中央仓库 | 是远程仓库,仓库中jar由专业团队(maven团队)统一维护。中央仓库的地址:http://repo1.maven.org/maven2 |
注: 由于中央仓库服务器在国外,网速比较慢,我们一般远程仓库使用私服.<br />
2.4.1 配置本地仓库
本地仓库的位置是通过maven的核心配置文件(settings.xml)来配置的。settings.xml文件位于maven安装目录:..\apache-maven-3.5.2\conf\settings.xml 。
- 在你的电脑上创建一个空文件夹,每个人的本地仓库是自己慢慢生长起来的。
e:\repository
- 配置本地仓库,修改maven的安装目录中conf/settings.xml文件,在53行配置本地仓库为上面的目录。默认是注释掉的。
<localRepository>e:\repository</localRepository>
- 私服配置,修改settings.xml文件,159行指定中央仓库的镜像。这里使用的是阿里云的中央仓库,速度比官方的快很多。注:要保留mirrors (s)
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
- 修改maven使用JDK的版本,200行。如果不配置就需要在idea中配置。maven默认使用的是JDK1.5的版本,这里使用1.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>
5). 私服说明
【传智局域网私服】- 局域网用
<mirror>
<id>my</id>
<mirrorOf>*</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://192.168.50.187:8081/repository/maven-public/</url>
</mirror>
【阿里云私服】—连外网时使用
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
注: 千万注意, 只可配置一个(另一个要注释!) 不然两个可能发生冲突 ,导致jar包下不下来 !!!!!!!
2.4.2 总结
- 资料中的settings.xml 文件覆盖 maven/conf/settings.xml
- 修改本地仓库 localRepository (事先创建一个文件夹 repository)
- 远程仓库,以后可能修改: 现在默认阿里云,可能需要切换(两个只能配一个,另一个要注释)
三、IDEA创建maven工程【重点】
maven中提供了一个插件archetype,这个插件可以帮助我们创建maven的标准项目。命令是:
mvn archetype:generate
但是,开发过程中我们往往不使用命令来创建,而是直接使用工具创建maven项目。
(大家第一次使用maven, 要联网 )
1、IDEA配置本地maven
使用idea创建maven工程之前需要将本地的maven配置到idea环境中,配置方法如下:
1.1 配置本地maven
- 第一步:打开default settings(对以后的新建工程生效):
2018.2 版idea
- 第二步:配置maven_home和settings.xml的路径:
1.2 配置maven参数
使用idea创建maven项目后,默认会去网络中下载一些配置资源。需要设置参数archetypeCatalog。设置方法如下:将-DarchetypeCatalog=internal 设置到Maven--Runner--VM Options中。
参数:
-DarchetypeCatalog=internal
2、创建maven的java工程
使用maven创建的项目可分为3种类型:**普通java项目**,**web项目**和**maven的父工程**。 这三种项目对象的打包方式分别是:jar,war和pom。本课程只涉及到普通的java项目和web项目的创建。
编写代码 -> 编译 -> 打包 -> 发布
jar : java archives (java项目的压缩包: 主要.class文件)
war : web archives (web项目的压缩包: 除了.class文件,多资源文件)
# idea中的项目和模块的区别
1. 介绍
1) 项目: project
2) 模块 : module
2. 规范用法
1). 一个项目可以包含多个模块的
2). 模块之间一般是有关系的
3. 学习阶段的做法
1). 创建一个empty project
2). 每天创建一个模块(在idea中,一屏一个项目,方便回顾)
4. 问题
1). 一个空工程,每天学习一个模块,A模块有问题,B模块也运行不了
2.1 创建步骤
- 第一步:File—New-project
- 第二步:然后再new module, 选择maven然后下一步:
- 第三步:填写项目的坐标信息:
附:
GroupID是项目组织唯一的标识符, 比如我的项目叫test001 那么GroupID应该 com.itheima.test001 域名.公司名.项目名
ArtifactID就是项目的唯一的标识符, 一般是 项目名-xxx 比如test001-model
- 第四步:指定项目名称和路径:idea会把项目名中的
-
去掉,我们给添加上即可。
2.2 java工程目录简介
2.3 测试
在java目录下创建包:com.heima.maven。然后,创建一个java类MavenTest,编写以下代码进行测试:
package com.heima.maven;
public class MavenTest {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
运行程序:点击main方法左侧的绿色小三角,点击图标1 或者图标2 运行程序:
运行结果:如果控制台上能够正常打印如下信息,则说明工程创建没问题:
四、maven项目构建的生命周期(了解)
1、maven项目构建的生命周期
1.1 生命周期是什么
在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译,测试及部署。虽然大家都在不停地做构建工作,但公司和公司间,项目和项目间,往往使用不同的方式做类似的工作。
Maven的生命周期就是为了对所有的构建过程进行抽象和统一。Maven从大量项目和构建工具中学习和反思,单后总结了一套高度完美的,易扩展的生命周期。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。
比如我们项目最常用的一套流程如下:
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际工作,在Maven的设计中,实际任务(如源代码编译)都交由插件来完成。
1.2 maven的三套生命周期
maven的生命周期不止这一套,总共分为3套,每套里面包含的事件如下
(1)clean:清理工作
pre-clean:执行一些在clean之前的工作
clean:移除上一次构建产生的所有文件
post-clean:执行一些在clean之后立刻完成的工作
(2)default:核心工作,例如编译,测试,打包,部署等
这里面的事件非常的多,如下图
对于default生命周期,每个事件在执行之前都会将之前的所有事件依次执行一遍
(3)site:产生报告,发布站点等
pre-site:执行一些在生成站点文档之前的工作
site:生成项目的站点文档
post-site:执行一些在生成站点文档之后完成的工作,为部署做准备
site-deploy:将生成的站点文档部署到特定的服务器上
2、maven生命周期相关命令
我们使用以下命令可以完成maven生命周期
mvn clean:调用clean生命周期的clean阶段,清理上一次构建项目生成的文件;
mvn compile :编译src/main/java中的java代码;
mvn test :编译并运行了test中内容 ;
mvn package:将项目打包成可发布的文件,如jar或者war包;
mvn install :发布项目到本地仓库 ;
2.1、mvn clean
clean命令的作用是清理项目编译或打包后生成的文件,具体对应maven项目中的target目录;
2.2、mvn compile
compile命令的作用是编译src/main/java中的java代码编译成可直接运行的class文件。编译完成后maven项目会自动创建一个target目录来存储这些文件。
2.3、mvn test
test命令的作用是编译并运行maven项目的src/test目录下的junit测试代码。
编译后生成的文件:
运行日志:
2.4、 mvn package
package命令是将项目打包成可以发布的包。maven项目常见的打包方式有两种,maven的java project会打成jar包。maven的web project会打成war包。打包完成后将生成的文件存放在target目录中。
2.5、 mvn install
install命令是将当前的项目打包并发布到本地仓库中,供本地的其他maven项目使用。项目发布的路径:**本地仓库路径/groupId/artifactId/**<br />
3、maven生命周期相关插件
maven的核心分发包只有几兆大小,核心包中仅仅定义了抽象的生命周期。生命周期的各个阶段都是由插件完成的,它会在需要的时候下载并使用插件,例如我们在执行mvn compile命令时实际是在调用maven的compile插件来编译java源码:
我们使用IDEA创建maven项目后,就不需要再手动输入maven的命令来构建maven的生命周期了。IDEA给每个maven构建项目生命周期各个阶段都提供了图形化界面的操作方式。具体操作如下:
3.1 打开maven视图
依次打开:View--》Tool Windows--》Maven Projects
打开IDEA编辑区右侧:Maven Projects会弹出如下窗口,打开窗口中的Lifecycle即可看到相关命令。
3.2 执行命令
双击Lifecycle下的相关命令图标即可执行对应的命令。
五、maven应用详解【重点】
maven是一个项目管理工具,他的作用:1.构建项目及项目的生命周期;2.依赖管理;3.插件管理;
1、pom配置详解
pom(Project Object Model)指的是项目对象模型,用来描述当前的maven项目。使用pom.xml文件来实现。
【补充】
setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件;而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>4.0.0</modelVersion>
<groupId>com.heima.maven</groupId>
<artifactId>maven-web2</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
</project>
【pom文件详解】
1. <project> :pom文件的根节点;
2. <modelVersion>: 声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,目前POM模型版本是4.0.0;
3. <groupId> :maven项目组织id标识符,一般是公司域名倒过来写;
4. <artifactId>:项目的标识符--项目名。
5. <version>:项目的版本号;
6. <packaging>:maven项目的打包方式一般配置jar或者war;
2、依赖管理【重点】
Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。
2.1 Maven坐标
Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。坐标的定义元素如下:
- groupId:定义当前项目(jar包)隶属的实际项目组。
- artifactId:定义当前项目(jar包)的名称;
- version:定义当前项目(jar包)的版本号;
通过上面三个参数我们就能够确定一个唯一版本号的jar包。
2.2 依赖导入
1、从本地仓库中导入(注意:只能搜索到已下载到本地的jar包):
IDEA中给我们提供了一种搜索jar包的方式,帮助我们快速导入jar包。使用方法如下:
- 第一步:鼠标光标移入到在pom.xml文件中,按Alt+Insert键。会弹出一个选择框:
- 选择Dependency后会弹出一个搜索框:输入要添加的jar包的名字
选择需要的jar包后按回车键即可自动添加此依赖;
2、从远程仓库中获取坐标:
如果我们导入的依赖本地仓库中没有,使用IDEA搜索就搜索不到了,我们需要从网络中查找这个依赖的坐标,然后将其添加到pom文件中。添加完成之后,maven会帮我们从私服或中央仓库中下载该依赖。
搜索依赖坐标的方法:
- 在中央仓库中查找:http://mvnrepository.com/
将以下坐标复制到pom文件中即可:
pom文件中引入依赖后,会去私服或者中央仓库中下载依赖:如果项目结构的External Librarites中出现刚引入的依赖,则说明依赖引入成功。
私服
阿里云: https://maven.aliyun.com/mvn/search
3、maven插件(了解)
插件, 外挂(plugin) : 是指定的系统平台的补充性程序, 脱离平台不能单独运行
我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成。例如编译源代码是由maven-compiler-plugin完成的,但是这些插件都是maven默认的插件,如果需要配置自己的插件,则需要通过插件的坐标来引入插件。插件的坐标可以从maven官方提供的插件列表进行下载:
Maven官方有两个插件列表:
第一个列表的GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址为:http://maven.apache.org/plugins/index.html。
第二个列表的GroupId为org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,其地址为:http://mojo.codehaus.org/plugins.html。
常用的插件有编译插件和tomcat插件,这两个插件的坐标及配置如下:
3.1 测试插件maven-surefire-plugin
maven的test指令运行测试代码存在中文乱码问题, 用这个插件可以解决
<build>
<plugins>
<!--test插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<forkMode>once</forkMode>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
</plugins>
</build>
技巧
附一:拷贝repository
在软件目录下有个repository.rar, 直接解压到你的本地仓库路径,进行合并
-> 这样就可以不用老是从远程仓库下载了
但是有个问题: 本地仓库突然多东西,idea是不知道的
解决: 看附二
附二:更新依赖索引
有时候给idea配置完maven仓库信息后,在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了,具体做法如下:
打开设置——搜索maven——Repositories——选中本地仓库——-点击Update
有些版本的idea没有这个索引, 那就算了…
附三:清理maven仓库 (重点!!!)
初始情况下,我们的本地仓库是没有任何jar包的,此时会从私服去下载(如果没有配置,就直接从中央仓库去下载),可能由于网络的原因,jar包下载不完全,这些不完整的jar包都是以lastUpdated结尾。此时,maven可能不会再重新帮你下载,需要你删除这些以lastUpdated结尾的文件。如果本地仓库中有很多这样的以lastUpadted结尾的文件,可以执行如下脚本来删除:
在上面的bat文件上右键—-》编辑 。修改文件:
修改完毕后,双击运行即可删除maven仓库中的残留文件。