介绍
- Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。
基于项目对象模型(缩写:POM)概念Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。Maven 也可被用于构建和管理各种项目,例如
C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立
Apache 项目。 - 参考菜鸟教程
作用
- 能帮我们构建工程,管理 jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮我们部署项目,生成 Web 站点。
Maven的原理
- Maven 的一个核心特性就是依赖管理。当我们涉及到多模块的项目(包含成百个模块或者子项目),管理依赖就变成
一项困难的任务。Maven 展示出了它对处理这种情形的高度控制。 - 传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。那么
maven 工程是如何使得工程变得很少呢?
- 经分析:maven是通过pom.xml文件来添加所需的jar包坐标,从而在需要的时候通过pom.xml文件中的坐标到一个专门用于”存放 jar 包的仓库”(maven 仓库)中根据坐标从
- 而找到这些 jar 包将其引进来。
注: 为了解决这个通过坐标来去仓库加载jar过程中速度慢的问题,maven 中也有索引的概念,通 过建立索引,可以大大提高加载 jar 包的速度,使得我们认为 jar包基本跟放在本地的工程文件中再 读取出来的速度是一样的。这个过程就好比我们查阅字典时,为了能够加快查找到内容,书前面的目录就好比是索引,有了这个目录我们就可以方便找到内容了,一样的在 maven 仓库中有了索引我 们就可以认为可以快速找到 jar 包。
项目的构建
- 项目往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程。
- 构建:就是指项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个
过程称为构建。 - 一键构建:指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作。
- Maven 规范化构建流程如下:
Maven的使用
-
下载
- 到官网去下载:下载地址:官网
- 到官网去下载:下载地址:官网
-
安装
-
下载后将其解压到一个没有中文没有空格的路径下。
-
目录结构介绍
-
bin:存放了 maven 的命令,比如我们前面用到的mvn tomcat:run
-
boot:存放了一些 maven 本身的引导程序,如类加载器等
-
conf:存放了 maven 的一些配置文件,如 setting.xml 文件
-
lib:存放了 maven 本身运行所需的一些 jar 包
-
至此我们的 maven 软件就可以使用了,前提是你的电脑上之前已经安装并配置好了 JDK。
-
-
环境的搭建
- 注意:maven版本和jdk版本需要统一
- 版本统一可以参考以下链接:http://maven.apache.org/docs/history.html
- 这里使用JDK 8
- JDK环境搭建参考:https://blog.csdn.net/qq_43556844/article/details/114648462
- maven环境搭建:注意这一步之前需要将java环境搭建好,使用JDK1.7 +版本
配置MAVEN_HOME,变量值是maven的安装路径(即bin目录之前的一级目录)
- 测试:
- 使用mvn -v命令可以看到 maven 的版本为 3.8.3 及 java 版本为 1.8 即为安装成功。
Maven仓库
- Maven 仓库的分类
-
maven 的工作需要从仓库下载一些 jar 包,如下图所示,本地的项目 A、项目 B 等都会通过 maven
软件从远程仓库(可以理解为互联网上的仓库)下载 jar 包并存在本地仓库,本地仓库 就是本地文
件夹,当第二次需要此 jar 包时则不再从远程仓库下载,因为本地仓库已经存在了,可以将本地仓库
理解为缓存,有了本地仓库就不用每次从远程仓库下载了
-
本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,
优先从本地仓库查找 -
默认本地仓库位置在
${user.dir}/.m2/repository,${user.dir}表示windows 用户目录
。
-
远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。
远程仓库可以在互联网内也可以在局域网内。 -
中央仓库 :在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中
央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包
含了世界上大部分流行的开源项目构件。 -
Maven本地仓库的配置
- 若自己的本地仓库中存放着大量需要的jar包,可以实现无网环境的开发。
-
更换电脑进行开发的时候可以将之前的repository库放在新的电脑上(这样之前下载的jar都可以用)
如我们将自己的repository放在D盘( D:\repository)目录下。 -
这时我们需要在 MAVE_HOME/conf/settings.xml(即maven 的安装目录下)配置本地仓库位置
-
全局setting与用户setting
- maven 仓库地址、私服等配置信息需要在 setting.xml 文件中配置,分为全局配置和用户配置。
在 maven 安装目录下的有 conf/setting.xml 文件,此 setting.xml 文件用于 maven 的所有 project
项目,它作为 maven 的全局配置。 - 如需要个性配置则需要在用户配置中设置,用户配置的 setting.xml 文件默认的位置在:
${user.dir} /.m2/settings.xml 目录中,${user.dir} 指windows 中的用户目录
。 - maven会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。
- maven 仓库地址、私服等配置信息需要在 setting.xml 文件中配置,分为全局配置和用户配置。
-
Maven工程的认识
- src下文件的介绍
- src/main/java —— 存放项目的.java 文件
- src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件
- src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类
- src/test/resources —— 测试资源文件
- target —— 项目输出位置,编译后的class 文件会输出到此目录
- pom.xml——maven 项目核心配置文件
- 注意:如果是普通的 java 项目,那么就没有webapp 目录。
Maven常用命令
- 我们可以在cmd 中通过一系列的 maven 命令来对我们的 maven-helloworld 工程进行编译、测试、运
行、打包、安装、部署。 - compile
- compile 是 maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target
目录下。 - cmd 进入命令状态,执行mvn compile,如下图提示成功:
- 查看 target 目录,class 文件已生成,编译完成
- compile 是 maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target
- test
- test 是 maven 工程的测试命令 mvn test,会执行src/test/java下的单元测试类。
- clean
- clean 是 maven 工程的清理命令,执行 clean 会删除 target 目录及内容。
- package
- package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于web 工程打成war
包。
- package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于web 工程打成war
- install
- install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。
- 从运行结果中,可以看出:
- 当后面的命令执行时,前面的操作过程也都会自动执行,
- Maven 指令的生命周期
- maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,
- 这三套生命周期分别是:
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
- maven 的概念模型
- Maven 包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project
Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段
(phase)中插件(plugin)目标(goal)的逻辑。
- 项目对象模型 (Project Object Model)
- 一个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、
插件目标等。 - 依赖管理系统(Dependency Management System)
- 通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。
- 一个项目生命周期(Project Lifecycle)
- 使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些
- 过程规范为一个生命周期,如下所示是生命周期的各各阶段:
- 一个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、
使用idea搭建Maven工程
-
首先配置在idea中配置maven
-
新建一个工程->选择 idea提供好的 maven 的web 工程模板->点击 Next填写项目信息
-
点击完成后开始创建工程
-
可以看到最终的目录不完整,需要手动去补齐。
-
创建新文件夹后,点击 OK 后,在新的文件夹 java 上右键Make Directory as Sources Root
-
测试运行
-
新建一个ServletDemo的java类,可以看到会报错,因为需要导入servlet-api-xxx.jar包。
-
在maven中导入该jar包–>首先在pom.xml文件(idea有提示功能)
-
添加 jar 包的坐标时,还可以指定这个 jar 包将来的作用范围。
-
每个 maven 工程都需要定义本工程的坐标,坐标是 maven 对 jar 包的身份定义,比如:入门程序的
-
坐标定义如下:
<!--项目名称,定义为组织名+项目名,类似包名-->
<groupId>com.demo</groupId>
<!-- 模块名称 -->
<artifactId>Hello</artifactId>
<!-- 当前项目版本号,snapshot 为快照版本即非正式版本,release为正式发布版本 -->
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--
打包类型
jar:执行 package 会打成 jar 包
war:执行 package 会打成 war 包
pom :用于 maven 工程的继承,通常父工程设置为 pom
-->
-
坐标来源
-
添加依赖需要指定依赖 jar 包的坐标,但是很多情况我们是不知道 jar 包的的坐标,可以通过如下方
式查询: -
依赖范围
- A 依赖 B,需要在 A 的 pom.xml 文件中添加 B 的坐标,添加坐标时需要指定依赖范围,依赖范围包
括:- compile:编译范围,指 A在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
- provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。
- runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。
- test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以test范围依赖不会被打包。
- system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用。
- A 依赖 B,需要在 A 的 pom.xml 文件中添加 B 的坐标,添加坐标时需要指定依赖范围,依赖范围包
-
在 maven-web 工程中测试各 scop。
-
测试总结:
- 默认引入 的 jar 包 ------- compile 【默认范围 可以不写】(编译、测试、运行 都有效 )
- servlet-api 、jsp-api ------- provided (编译、测试 有效, 运行时无效 防止和 tomcat 下 jar 冲突)
- jdbc 驱动 jar 包 ---- runtime (测试、运行 有效 )
- junit ----- test (测试有效)
- 依赖范围由强到弱的顺序是:compile>provided>runtime>test
-
在项目中使用
-
设置 jdk 编译版本
-
本教程使用 jdk1.8,需要设置编译版本为 1.8,这里需要使用 maven 的插件来设置:
-
在 pom.xml 中加入:
-
编写servlet
-
内容如下
-
编写jsp
-
添加tomcat7插件
-
在pom.xml中添加tomcat7插件后plugins中还是没有tomcat7插件图标
-
原因:pluginManagement标签锁定插件版本(自动创建时带的)
-
故需要删除此标签,重新载入一下项目就可以看到了。
-
也可以将其配置成运行命令
-
则按下图执行
-
执行后可以看到出现了运行配置,以后就可以直接点击运行按钮进行运行了
-
可以看到运行成功
-
调试
-
端口占用处理
-
重新执行 tomcat:run 命令重启工程,重启之前需手动停止 tomcat,否则报下边的错误: