Maven 基础知识总结笔记
Posted IT_Holmes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven 基础知识总结笔记 相关的知识,希望对你有一定的参考价值。
文章目录
1. 为什么要用 Maven?
效果图:
使用maven的优点:
- 借助于maven就可以将一个项目拆分成多个工程。
- 借助maven可以将jar包仅仅保存在 " 仓库 "中,有需要使用的工程引用这个文件接口,并不需要真的把jar包复制过来。
- 借助于maven可以以一种规范的方式下载jar包,不用自己去网上下载了,因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在了maven的中央库中的。
- 借助maven会自动将被依赖的jar包导入进来。
2. Maven 的 概述
Maven是一款服务于Java平台的自动化构建工程。
自动化构建工程中的 “构建” 是什么意思?
以"Java源文件",“框架配置文件”,“JSP”,“HTML” ,“图片” 等资源为 " 原材料 “,去” 生产 "一个可以运行的项目的过程。整体上就是一个编译,部署,搭建的过程
下图是一个创建Servlet动态web工程的一个构建过程:
提一句关于eclipse的一个小知识:
eclipse中的navigator视图是专门用来查看字节码的。平时我们通过Window =》 show view =》others 直接搜索就能打开了。
运行环境里面有我们常用的jar包。
3. 安装 Maven核心程序
1.检查JAVA_HOME环境变量:
2.解压Maven核心程序的压缩包
(去官网下载maven核心压缩包,注意要将解压的maven文件放到没有中文路径的磁盘下。)
3.配置maven的环境变量
- MAVEN_HOME或M2_HOME(这个不太清楚,可能为了兼容2版本)
- path路径,在maven_home路径上加个bin就行了。
- mvn -v来检验是否配置成功,并且环境变量配置后,命令行窗口要重新开一下。
4. Maven 决定的目录结构
创建约定的目录的结构:
根目录:工程名。
src目录:源码。
pom.xml文件:Maven工程的核心配置文件。
main目录:该目录用来写主程序。
test目录:用来测试程序的。
java目录:存放Java源文件。
resources目录:存放框架或其他工具的配置文件。
为什么要遵守约定的目录结构呢?
Maven要负责我们这个项目的自动化构建,以编译为例,Maven要想自动进行编译,那么它必须知道Java源文件保存在哪里,换句话说就是一个固定格式而已。
5. 关于Maven联网的问题
Maven关于联网的问题:(Maven的执行过程)
1.Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。
2.当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
3.本地仓库的默认位置: 当前用户系统的家目录.m2\\repository
4.Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载。
5.如果此时无法连接外网,则构建失败。
如何修改默认本地仓库的位置?
默认的仓库位置是c:\\Users\\当前用户.m2\\repository路径
- 首先,打开 Maven解压目录\\conf\\setting.xml文件。
- 找到localRepository标签。
- 然后配置好自己的路径就好了。
6. Maven POM
POM,全称Project Object Model 项目对象模型。
其实,有点像之前比较熟悉的DOM,全称 :Document Object Model 文档对象模型。
pom.xml 是Maven工程的核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。
7. Maven 坐标
比较一下数学中坐标和Maven的坐标:
数学中的坐标:
在平面上,使用X,Y两个向量可以唯一的定位平面中的任何一个点。
在空间上,使用X,Y,Z三个向量可以唯一的定位空间中的任何一个点。
Maven的坐标:
使用下面三个向量在仓库中唯一定位一个Maven工程。
1.groupid:公司或组织域名倒序+项目名。
<groupid>com.demo.maven</groupid>
2.artifactid:模块名称。
<artifactid>model_name</artifactid>
3.version:版本
<version>1.0.0.RELEASE</version>
所以上面也统称为Maven的gav,也就是坐标。
而这个坐标的作用就是可以映射出我们想要的jar位置在本机的哪里!
就比如上面的内容,对应的目录如下:
com/demo/maven/model_name/1.0.0.RELEASE/model_name-1.0.0.RELEASE.jar
格式就是这样来的,记住就行。
8. Maven 仓库
Maven的仓库有两个:
-
本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务。
-
远程仓库有三种:
1.私服: 搭建在局域网环境中,为局域网范围内的所有Maven工程提供服务。Nexus私服是类似于Tomcat一样,它也算是解决连接外网下载Maven的一种方式。
2.中央仓库:架设在Internet互联网上,为全世界所有Maven工程服务。
3.中央仓库镜像: 就是为了分担中央仓库的流量,提升用户访问速度。
仓库中保存的内容:
- Maven自身所需要的插件。
- 第三方框架或工具的jar包。
- 我们自己开发的Maven工程。
10. Maven 命令构建过程
执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。与构建过程相关:编译,测试,打包…
常用命令:
- mvn clean:清理编译后的东西(例如:Target目录)。
- mvn compile:编译主程序。
- mvn test-compile: 编译测试程序。
- mvn test: 执行测试。
- mvn package: 打包。
需要注意,我们执行命令需要在pom.xml所在的目录下执行。
不同的命令会产生对应的不同文件要注意!
我们使用mvn compile之后,会生成一个target文件,里面还会有两个文件:
一个是存储生成的字节码,一个是存储maven的状态文件(不确定)。
之后我们使用mvn test 测试时,还会在target文件中生成另外两个文件:
一个是存储报告的文件,一个是存储测试的字节码文件。
再然后我们执行mvn package来进行打包,这个是后target文件还会生成两个文件:
其中jar包中就包含了程序的字节码。
需要注意,上面是有先后顺序的,必须编译后,测试,测试后才能打包!
在让后,我们使用mvn install 命令将我们打包好的东西放到仓库中。
我们之前groupid定义的路径就是我们放置仓库的路径,也和mvn的坐标gav对应起来。
11. 使用Maven插件来创建工程(了解,一般用不上)
像通过上面的命令来操作的直接通过cmd命令创建工程。
12.使用idea来创建Maven工程
首先,我们先进入setting =》搜索maven,设置好maven路径和maven的setting.xml配置文件,再配置好本地仓库路径。
上面配置好了,我们就可以通过idea来创建。
第一步:点击右上角的符号来创建。
第二步:创建一个maven项目。
第三步:设定好名字和坐标!
第四步:设定结构,对应的结构要设定好!
这样一个标椎的maven工程就创建出来了。
我们之前mvn命令对应的在idea中也有:
直接双击就运行对应的命令。
maven的debug运行如何设置呢?
首先,点击edit Configurations…
然后添加一个maven:
之后我们就可以debug,打断点来调试测试了:
13. Maven 使用idea的模板(骨架)创建项目
13.1 使用模板(骨架)创建java项目
就是在创建的时候记得添加archetype中的quickstart。创建后可能缺少一些结构什么resource目录,可以自行添加并且声明文件类型。。
13.2 使用模板(骨架)创建web项目
同样,web项目就要添加webapp骨架。
也是缺少一些结构需要自己添加并且声明文件类型。
14. Maven tomcat插件安装与web启动
通过maven来安装tomcat插件,步骤如下:
第一步:创建一个webapp工程,设定好结构等等。
第二步:配置pom.xml文件如下:(重点看build中的插件内容)
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>WebAppTest01</name>
<groupId>com.test</groupId>
<artifactId>WebAppTest01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 我们在Maven restor官网上查询org.apache.tomcat.maven 下的 Apache Tomcat Maven Plugin :: Tomcat 7.x插件依赖,得到tomcat的坐标。 -->
<!--构建-->
<build>
<!--添加插件-->
<plugins>
<!--具体插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
</plugin>
</plugins>
</build>
</project>
第三步:配置好后因为要加载插件等操作需要时间不要着急,加载完成后,打开右侧Maven项目,刷新一下,我们可以看到一个tomcat插件已经存进来了,直接双击run就可以运行tomcat了。
run运行后,当前项目就可以在上面运行了,并且会告诉你访问地址。
除了使用tomcat插件我们还可以配置tomcat插件:
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>WebAppTest01</name>
<groupId>com.test</groupId>
<artifactId>WebAppTest01</artifactId>
<version>1.0-SNAPSHOT</version>
<!--构建-->
<build>
<!--添加插件-->
<plugins>
<!--具体插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>9090</port><!--端口-->
<path>/</path><!--设置虚拟路径-->
</configuration>
</plugin>
</plugins>
</build>
</project>
如果嫌弃一直点击run麻烦,我们也可以在页面再添加一个maven执行命令。
当然一般这种情况是用来debug的。
下面介绍一下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/maven-v4_0_0.xsd">
<!-- 指定pom的模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- Web工程打包为war,Java工程打包为jar -->
<packaging>war</packaging>
<name>WebAppTest01</name>
<!-- 组织id -->
<groupId>com.test</groupId>
<!-- 项目id -->
<artifactId>WebAppTest01</artifactId>
<!-- 版本号:一般有两个release(完成版)和snapshot(快照,开发版本) -->
<version>1.0-SNAPSHOT</version>
<!--构建-->
<build>
<!--添加插件-->
<plugins>
<!--具体插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>9090</port><!--端口-->
<path>/</path><!--设置虚拟路径-->
</configuration>
</plugin>
</plugins>
</build>
<!-- 设置当前工程所有的依赖 -->
<dependencies>
<!--具体依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
15. Maven 依赖
15.1 依赖
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖,它就是通过pom.xml下的dependencies来设置。
15.2 依赖传递
15.2.1 直接依赖 和 间接依赖
简而言之,就是项目1依赖于项目2,那么项目1也会依赖项目2所依赖的内容,自然这些依赖了的内容也是可以让项目1使用的,这就是依赖传递。
当然因为上面这种情况,也就分为了:直接依赖和间接依赖。
15.2.2 依赖传递的冲突问题
冲突问题就是可能依赖的插件或包中,有版本不同的,不同层级的。
下面的路径优先和声明优先必须知道!
16. Maven 可选依赖 和 排除依赖
可选依赖指对外隐藏当前所依赖的资源 (不透明)。
在dependency标签下有一个optional标签,该标签声明为true就可以对外隐藏所依赖的资源,默认为false。
这里我们是项目1是依赖了项目2 , 上面的情况是在项目2中配置,从而让项目1看不到。
接下来我们可以在项目1中配置,不想看到项目2的依赖。
这就用到排除依赖:
注意:排除依赖和可选依赖不一样,虽然效果相同,但排除依赖是主动断开这个依赖资源!换句话说,就是当前依赖我们不使用,就可以排除了。
使用exclusions标签来配置:
17. Maven 依赖范围
scope标签,是用来定义Maven的依赖范围的。
scope范围如下:
- compile(也是默认):在main中执行,在test中执行,打包也要打包进去。例如:log4j,无论什么时候都需要日志记录啊。
- test:就是仅仅在test模块结构中使用,例如:junit。
- provided:在main中执行,在test中执行,但是有些情况是绝对不能参与打包的,例如:servlet-api,如果打包添加了一个2版本,但是服务器是3版本,这样我们将包放到服务器,就版本不同奔溃了呀。
- runtime:仅仅是打包能参与。
我们也可以通过右侧Maven项目看依赖的范围是多少。
依赖范围的传递性:
在我们依赖传递的过程中,设定的scope范围可能彼此不相同。
18. Maven 生命周期 与 插件
18.1 Maven 生命周期(lifecycle)
Maven构建生命周期描述的是一次构建过程经历了多少个事件。
Maven对项目构建的生命周期划分为3套。
- clean:清理工作。
- default:核心工作,例如:编译,测试,打包,部署等。
- site:产生报告,发布站点。
clean构架的生命周期又分为下面3个阶段:
- pre-clean:执行一些需要在clean之前完成的工作。
- clean:移除所有上一次构建生成的文件。
- post-clean:执行一些需要在clean之后立刻完成的工作。
default构建的生命周期有很多阶段,见图下:
而我们执行哪一个命令,其实就是从上向下的一个执行步骤。
例如:我们执行compile命令,只需要从第一个到complie就可以了。我们执行install命令,那我们就需要从第一个执行到install命令,期间也执行了compile和test等命令,这就是生命周期的一个效果。
site构建生命周期的四个阶段:
- pre-site:执行一些需要在生成站点文档之前完成的工作。
- site:生成项目的站点文档。
- post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。
- site-deploy:将生成的站点文档部署到特定的服务器上。
18.2 Maven 插件
插件和生命周期内的阶段是绑定的!在执行到对应生命周期时执行对应的插件过程。
也就是插件时可以伴随上面生命周期的阶段来运行的,可以让我们自定义其他功能,这个时候需要定义好execution标签如下:
就像上面说的,执行lifecycle生命周期的命令时,它是从上往下的命令开始的,因此我们generate-test-resources阶段是在complie命令之后,test-compile命令之前的,因此执行compile不会执行响应插件,执行test-compile就会经过generate-test-resources这个阶段了。
总结,生命周期就是指当前是哪个阶段,而插件则是定义好在哪一个生命周期阶段要做什么事情!
以上是关于Maven 基础知识总结笔记 的主要内容,如果未能解决你的问题,请参考以下文章
springmvc学习总结 -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解