1. Maven是什么?
Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目(https://maven.apache.org/)。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目开发结构管理工具,可以对 Java 项目结构、开发、构建、依赖进行统一 标准的管理。
myecplise的JavaWeb项目的结构
eclipse的JavaWeb项目的结构
idea的JavaWeb项目的结构
通过上面的JavaWeb项目的结构对比,我们会发现myecplise、eclipse、idea都是创建JavaWeb 项目,但是JavaWeb项目的结构确实不同的,这就给开发带来的很大的问题,比如:原来用 myeclipse开发的项目想迁移到idea中,那是不可能的,因为结构不同,同理eclipse开发的项目 也无法迁移到idea中,idea开发的项目也无法迁移到myeclipse和eclipse中。
项目结构不同,项目的开发和构建也会产生细微的差别。
所以在软件开发行业奋战多年的前辈们就在想,有没有一种方案可以解决这个问题呢?就这样 Maven就应运而生。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。 Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache项目。
2. Maven的作用(为什么要使用Maven?)
1.统一标准的项目开发构建方式
2.依赖管理:Java开发中往往除了核心的JDK之外,我们还要用到大量的第三方jar包,尤其是我 们在使用第三方框架开发时,框架本身又要依赖一堆第三方jar包,这些第三方jar包有可能还会依赖别的jar包。我们再手动处理这些依赖时往往效率低下,很头疼。
maven可以很好的解决上面的问题,它能够自动处理级联依赖,还有依赖之间版本兼容问题。并且通过依赖管理操作,开发项目时就不需要到网上专门去找jar包,再拷贝到项目中了,可以节约项目的整体大小。
3. 什么场合下会用到maven?
当我们的项目中依赖的第三方jar包很多,关系很复杂时,靠我们手工来处理几乎不可能,那么这种情况下,maven就非常适合了。
4. 安装配置maven环境
4.1 maven下载、安装
4.1.1 maven下载
下载地址:https://maven.apache.org/download.cgi
4.1.2 maven安装
把上面下载下来的zip包解压到你喜欢的路径下, 注意最好不要解压到有中文、空格、特殊符号的目录,避免中文乱码问题。
各目录结构说明:
- bin:可执行程序目录,
- boot:maven自身的启动加载器
- conf:maven配置文件的存放目录
- lib:maven运行所需库的存放目录
4.1.3 环境变量配置
将mvn解压后的bin目录的路径添加到系统的Path环境变量中。
之后通过cmd打开windows的命令提示窗口,执行指令mvn -v,出现如下信息表示maven安装成功。
4.2 maven仓库
maven仓库中主要存放的是maven管理的开发项目所需的各种依赖jar包,在开发的时候如果使用的依赖jar包没有,maven会自动下载到本地仓库中,方便我们使用。
maven仓库分为3种:
-
中央仓库(https://repo1.maven.org/maven2/)官方仓库
maven默认的一个远程仓库。可以理解为是一个特殊的远程仓库。
-
远程仓库(不是官方仓库,比如阿里巴巴远程仓库)
当首次运行maven项目时,本地仓库中空空如也,maven需要有一个地方下载我们项目中需要的所有依赖包,这个地方就是远程仓库。 一般是各个公司内部会搭建一套远程仓库
-
本地仓库
Windows系统,本地仓库默认路径是用户下面的.m2目录下的repository目录,如: C:\Users\John.m2\repository
各种仓库之间的关系:
- 当开发所需的依赖jar包本地仓库没有时,会连接远程仓库查找,远程仓库没有时,会连接中央仓库查找,找到之后从中央仓库下载到远程仓库,再从远程仓库下载到本地仓库,然后进行使用。
- 如果没有远程仓库,那本地仓库没有时,直接连接中央仓库查找,找到之后从中央仓库直接下载到本地仓库,然后进行使用。
4.3 Maven配置文件配置本地仓库
开发者要在自己电脑上使用maven开发项目,首先要做的就是配置本地仓库,在哪里配置了,这就要提到maven的配置文件了,主要分为3种:
- 全局配置文件: %maven_home%/conf/settings.xml
- 用户级别的配置文件:C:\Users\John.m2\settings.xml
- 项目级别配置文件: 项目根路径下的pom.xml
一般我们在全局配置文件中进行本地仓库配置即可,用户级别的配置文件一般不用,项目级别的 配置文件会自动使用全局配置文件的配置。
本地仓库直接使用课程资料中提供的即可(将课程资料中的MavenRepository.zip解压到maven安装目录的同级目录即可)。
注意:本地仓库如果不配置,默认在C:\Users\John.m2\repository目录下。
4.4 maven配置阿里云远程仓库
因为Maven软件是国外工程师开发的,所以maven的中央仓库是在国外维护的,那这对于中国就不太友好了(中国外网被墙,经常连接不上国外网络),所以为了开发方便,一般我们都会配置阿里云远程仓库为maven的远程仓库,这样使用时就不会出现网络问题了。
配置阿里云镜像有两种方式: 修改全局配置文件或者项目中pom.xml
-
第一种方式:修改全局配置
在maven安装目录下的conf目录下,找到settings.xml,在标签下添加如下内容:
<mirror> <id>central</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
-
第二种方式: 修改项目的pom.xml,在其中添加(不推荐)
<repositories> <repository> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
至此maven的基本配置就完成了。
5. Maven的生命周期及基本命令(了解)
5.1 Maven的生命周期
当然maven的生命周期不止这一套,总共分为3套,每套里面包含的事件如下:
(1)clean生命周期:清理工作
pre-clean:执行一些在clean之前的工作
clean:移除上一次构建产生的所有文件
post-clean:执行一些在clean之后立刻完成的工作
(2)default生命周期:核心工作,例如编译,测试,打包,部署等
对于default生命周期,每个事件在执行之前都会将之前的所有事件依次执行一遍
(3)site生命周期:产生报告,发布站点等
pre-site:执行一些在生成站点文档之前的工作
site:生成项目的站点文档
post-site:执行一些在生成站点文档之后完成的工作,为部署做准备
site-deploy:将生成的站点文档部署到特定的服务器上
5.2 Maven的基本命令
进入到需要构建的maven项目的根目录中,通过cmd打开的命令提示窗口可以执行如下命令进行 maven项目的构建。
6. 在开发工具中使用maven
eclipse中配置Maven
1.打开设置面板,选择maven设置项
2.选择自己安装的maven
3.启用刚才配置的maven
eclipse中创建Maven项目
- 新建工程选择maven project
-
选择项目骨架模板
1)JavaSE工程建议选择 maven-archetype-quickstart
2)JavaWeb工程建议选择 maven-archetype-webapp
- 填写项目三要素: groupId、artifactId、version
包名会自动根据groupId和ArtifactId来生成,我们也可以自己修改
IDEA中配置Maven
1.打开IDEA设置面板
2.找到maven设置项,修改如下地方
IDEA中创建Maven工程
1.文件 -> 项目 -> Maven
2.设置创建项目所需的JDK,设置创建项目使用的模板(不使用模板,默认创建就是JavaSE项目)
3.设置组ID(groupid)、工件ID(ArtifactId)、版本(version)
4.设置maven信息,一般idea会自动配置好
注意如果提示是否要开启自动导入,要开启。
5.创建Maven项目工程成功,补充代码编写目录
使用模板构建Maven项目有一个问题就是代码编写目录是不会自动创建的,需要我们手动创建。 在src\main目录下创建java和resources目录,并标记为maven项目资源目录。
在src下创建test目录,再在test目录下创建java和resources目录,并标记为maven项目测试资 源目录。
创建成功的Maven项目的整体目录
7. Maven的目录结构
- JavaSE
- JavaWeb
8. POM文件
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖jar,等等。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息, 然后执行目标。
我们经常需要打交道的就是这个pom.xml文件。
POM 中可以指定以下配置:
- 项目坐标
- 自定义properties
- 项目打包方式
- 添加依赖
- 管理依赖
- 构建
- 添加插件
- 插件管理
- 项目构建 profile
- 项目开发者列表(不重要)
- 相关邮件列表信息(不重要)
8.1 指定打包方式
通过packaging标签指定maven项目的打包方式
<packaging>jar</packaging>
取值一般有如下三种
(1)jar:该资源打成jar包,默认是jar,javase项目。
(2)war:该资源打成war包,web项目。
(3)pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml 不生成jar或其他包结构,聚合和继承时使用。
8.2 Maven中的Properties
properties标签一般用于自定义属性或者设置内置属性。
maven中的properties标签有两种
-
自定义属性
通常用来统一管理版本,在 < dependencies > 标签中配置依赖时可以通过${自定义属性}来 引用标签中定义的属性
<properties> <junit.version>4.12</junit.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies>
-
内置属性
内置属性的定义方式和自定义属性一样,但是不需要我们显示去使用,maven会自动读取。 通常用来指定项目编码、编译版本等
<properties> <!-- 指定源代码文件的编码 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 设置编译版本 --> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
8.3 maven工程坐标
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
如下代码中,groupId和artifactId构成了一个Jar包的坐标。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
- groupId:定义当前资源隶属组织名称(通常是域名反写,如:org.mybatis; com.aaaa)
- artifactId:定义当前资源的名称(通常是项目或模块名称,如:crm,sms)
- version:定义当前资源的版本号
maven工程的三要素就是一个项目在maven仓库中的唯一坐标,决定了我们再添加依赖时能够定位到一个唯一的jar包。
8.4 添加依赖
在maven的pom.xml中,依赖的管理通过
一个标签代表一个依赖。 具体来说配置方式:
具体来说配置方式:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
我们添加完上面的配置以后,maven会将c3p0及相关的依赖自动添加到项目的构建路径下
如果不知道一个依赖jar包的坐标,可以通过https://mvnrepository.com/查找。
8.5 maven中依赖的Scope
scope表示依赖的作用范围
maven中的scope有:
- test
- compile(默认)
- runtime
- provided
- system
- import
8.6 传递依赖与排斥依赖
-
传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和间接引用的Jar包都下载到本地。
-
排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> <!-- 排除依赖 --> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency>
8.7 配置tomcat插件
之前构建的Web项目,需要部署到tomcat中才能运行访问,Maven构建的web项目就不用这么麻烦了,Maven提供了tomcat插件,配置之后就可以直接运行项目了。
<build>
<!-- 构建tomcat插件 -->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<!-- 项目端口和访问路径设置 -->
<configuration>
<port>8081</port>
<path>/maven</path>
<uriEncoding>utf-8</uriEncoding>
</configuration>
<version>2.2</version>
</plugin>
</plugins>
</build>