一、什么是Maven
1. Maven简介
- Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
1.1 Maven能解决的问题
项目开发不仅仅是写写代码而已,期间会伴随着各种必不可少的事情要做,下面列举几个感受一下:
- 我们需要引用各种 jar 包,尤其是比较大的工程,引用的 jar 包往往有几十个乃至上百个, 每用到一种 jar 包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的 jar 包冲突,版本冲突。
- 世界上没有不存在 bug 的代码,计算机喜欢 bug 就和人们总是喜欢美女帅哥一样。为了追求美为了减少 bug,因此写完了代码,我们还要写一些单元测试,然后一个个的运行来检验代码质量。
- 再优雅的代码也是要出来卖的。我们后面还需要把代码与各种配置文件、资源整合到一起,定型打包,如果是 web 项目,还需要将之发布到服务器,供人蹂躏。
Maven可以帮你从上面的繁琐工作中解放出来,能帮你构建工程,管理 jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成 Web 站点。
1.2 Maven的优势举例
- 前面的 Web 阶段项目,要能够将项目运行起来,就必须将该项目所依赖的一些 jar 包添加到工程中,否则项目就不能运行。试想如果具有相同架构的项目有十个,那么我们就需要将这一份 jar包复制到十个不同的工程中。我们一起来看一个 CRM项目的工程大小。
- 使用传统 Web 项目构建的 CRM 项目如下:
- 原因主要是因为上面的 WEB 程序要运行,我们必须将项目运行所需的 Jar 包复制到工程目录中,从而导致了工程很大。
- 同样的项目,如果我们使用 Maven 工程来构建,会发现总体上工程的大小会少很多。如下图:
2. Maven的两个经典作用
2.1 Maven 的依赖管理
- Maven 的一个核心特性就是依赖管理。当我们涉及到多模块的项目(包含成百个模块或者子项目),管理依赖就变成一项困难的任务。Maven 展示出了它对处理这种情形的高度控制。
- 传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。那么
maven 工程是如何使得工程变得很少呢? - 分析如下:
maven 工程中不直接将 jar 包导入到工程中,而是通过在 pom.xml 文件中添加所需 jar包的坐标,这样就很好的避免了 jar 直接引入进来,在需要用到 jar 包的时候,只要查找 pom.xml 文件,再通过 pom.xml 文件中的坐标,到一个专门用于”存放 jar 包的仓库”(maven 仓库)中根据坐标从而找到这些 jar 包,再把这些 jar 包拿去运行。
2.2 项目的一键构建
- 我们的项目,往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程。
- 一键构建,指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作。
二、Maven的使用
1. 下载
在官网中下载maven包,Maven官网
2. 安装
Maven 下载后,将 Maven 解压到一个没有中文没有空格的路径下,解压后目录结构如下:
- bin:存放了 maven 的命令,比如我们前面用到的 mvn tomcat:run
- boot:存放了一些 maven 本身的引导程序,如类加载器等
- conf:存放了 maven 的一些配置文件,如 setting.xml 文件
- lib:存放了 maven 本身运行所需的一些 jar 包
至此我们的 maven 软件就可以使用了,前提是你的电脑上之前已经安装并配置好了 JDK。
3. 配置环境变量
- 新建系统变量:MAVEN_HOME
变量值:自定义的路径 + \Maven\apache-maven-3.2.3 - 编辑系统变量:Path
添加变量值:%MAVEN_HOME%\bin - 查看是否配置成功:用win键+R,进入dos命令,输入mvn -v,出现如下信息则表明成功!
4. Maven仓库
4.1 Maven仓库的分类
maven 的工作需要从仓库下载一些 jar 包,本地的项目 A、项目 B 等都会通过 maven软件从远程仓库(互联网上的仓库)下载 jar 包并存在本地仓库(一个文件夹),当第二次需要此 jar 包时则不再从远程仓库下载,因为本地仓库已经存在了,可以将本地仓库理解为缓存,有了本地仓库就不用每次从远程仓库下载了,这儿有点git从远程拉取的感脚。
- 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找,默认本地仓库位置在${user.dir}/.m2/repository,${user.dir}表示 windows 用户目录。本地仓库的位置可以自定义。
- 远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网。
- 中央仓库 :在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。
4.2 Maven本地仓库的配置
- 在 MAVE_HOME/conf/settings.xml 文件中配置本地仓库位置(maven 的安装目录下)
- 打开 settings.xml文件
5. Maven工程
5.1 Maven 工程的目录结构
进入 src 目录后,我们发现它里面的目录结构如下:
如果是普通的 java 项目,那么就没有 webapp 目录。
三、Maven基本命令
1. compile:编译
将java源文件编译成class文件
2. test:测试项目
执行test目录下的测试用例
3. package:打包
将项目打成jar包
4. clean:删除target文件夹
5. install:安装
6. deploy
把本地jar包发送到远程仓库(私服)。
执行的插件:maven-deploy-plugin:2.8.2:deploy
四、Maven坐标
1. Maven坐标
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
如下代码中,groupId和artifactId构成了一个Jar包的坐标。
<!-- 依赖关系 -->
<dependencies>
<!-- 此项目运行使用 junit,所以此项目依赖 junit -->
<dependency>
<!-- junit 的项目名称 -->
<groupId>junit</groupId>
<!-- junit 的模块名称 -->
<artifactId>junit</artifactId>
<!-- junit 版本 -->
<version>4.9</version>
<!-- 依赖范围:单元测试时使用 junit -->
<scope>test</scope>
</dependency>
</dependencies>
2. 传递依赖 与 排除依赖
- 传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用的Jar包都下载到本地。
- 排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
<exclusions>
<exclusion>
<groupId>cn.ydg123.Web</groupId>
<artifactId>resource-search</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
</exclusion>
</exclusions>
3. 依赖范围scop
在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。
- compile :默认范围,用于编译
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime: 在执行时需要使用
- test: 用于test任务时使用
- system: 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用
五、idea部署maven项目
1. 配置maven
- 打开->File->Settings 配置 mave
2. 创建工程
-
打开 idea,选择创建一个新工程
-
选择 idea 提供好的 maven 的web 工程模板
-
点击 Next 填写项目信息
-
点击 Next,此处不做改动。
-
点击“finish”,耐心等待,直到出现如下界面
-
手动添加 src/main/java 目录,如下图右键 main 文件夹->New->Directory
-
创建一个新的文件夹命名为 java
-
在新的文件夹 java 上右键->Make Directory as->Sources Root
3. 创建一个Servlet
- src/java/main 创建了一个 Servlet,但报错
要解决问题,就是要将 servlet-api-xxx.jar 包放进来,作为 maven 工程应当添加 servlet 的坐标,从而导入它的 jar - 在 pom.xml 文件添加坐标,直接打开 hello_maven 工程的 pom.xml 文件
- 添加 jar 包的坐标时,还可以指定这个 jar 包将来的作用范围。
<!--项目名称,定义为组织名+项目名,类似包名-->
<groupId>com.itheima</groupId>
<!-- 模块名称 -->
<artifactId>hello_maven</artifactId>
<!-- 当前项目版本号,snapshot 为快照版本即非正式版本,release 为正式发布版本 -->
<version>0.0.1-SNAPSHOT</version>
<!--jar:执行 package 会打成 jar 包;war:执行 package 会打成 war 包-->
<packaging>jar</packaging>
4. 项目中添加的坐标
5. 设置 jdk 编译版本
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
6. 编写servlet与jsp页面
- 在java文件夹中创建一个servlet的测试类,重定向到一个jsp页面,编写要跳转的jsp页面
- 在 web.xml 中配置 servlet 访问路径
- 添加 tomcat7 插件
在 pom 文件中添加如下内容
- 此时点击 idea 最右侧 Maven Projects,
- 就可以看到我们新添加的 tomcat7 插件
- 双击 tomcat7插件下 tomcat7:run 命令直接运行项目
- 运行结果,显示jsp页面