1 Maven的概述
1.1 maven的概念
Maven是项目进行模型抽象,充分运用面向对象的思想,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。
- Maven是由Apache开发的一个工具。用来管理java项目, 依赖管理(jar包的管理),项目构建
特点:擅长管理大项目,自动管理开发者需要的包,自动进行下载我们需要的jar包
1.2 maven的作用
- 依赖管理: maven对项目的第三方构件(jar包)进行统一管理。向工程中加入jar包不要手工从其它地方拷贝,通过maven定义jar包的坐标,自动从maven仓库中去下载到工程中
- 项目构建: maven提供一套对项目生命周期管理的标准,开发人员、和测试人员统一使用maven进行项目构建。项目生命周期管理:编译、测试、打包、部署、运行
- maven对工程分模块构建,提高开发效率
1.3 maven的概念模型
- 项目对象模型。POM对象模型,每个maven工程中都有一个pom.xml文件,定义工程所依赖的jar包,本工程的坐标,打包运行方式
- 依赖管理系统(基础核心)。maven通过坐标对项目工程所依赖的jar包统一规范管理
- maven定义一套项目生命周期。清理,初始化,编译,测试。报告,打包,部署,站点生成。
- 一组标准集合。maven工程有自己标准的工程目录结构,定义坐标有标准
- maven管理项目生命周期都是基于插件完成的,例如开发中使用的tomcat插件
1.4 maven仓库
仓库名称 | 作用 |
---|---|
本地仓库 | 相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找。 |
中央仓库 | 就是远程仓库,仓库中jar由专业团队(maven团队)统一维护。中央仓库的地址:http://repo1.maven.org/maven2/ |
远程仓库(私服) | 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven须要下载构件的时候。它从私服请求,假设私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。 |
- 仓库存放的内容:
- Maven自身运行所需要的插件
- 第三方框架(spring/mybatis/springmvc)和工具类的jar包
- 我们自己开发的maven项目安装后的jar包
1.5 maven的坐标
-
Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。在Maven中,不论什么一个依赖、插件或者项目构建的输出, 都能够称之为
构件
-
为了能自动化的解析任何一个Java构件. Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的
坐标
坐标的定义元素如下:
- groupId:项目组织唯一的标识符,实际对应JAVA的包的结构(一般写公司的组织名称 例如:com.itheima,com.alibaba)
- artifactId: 项目的名称
-
version:定义项目的当前版本
2 maven的安装
2.1 本地安装
2.2 IDEA整合本地maven
使用软件版本号
-
在IDEA中找到Configure,进入setting
-
在搜索框输入maven,在maven中设置配置文件目录和仓库存储目录
-
在配置文件settings.xml中,添加下载源,采用国内的远程仓库,可加快maven项目在线下载速度
-
解决创建项目慢的问题
3 IDEA创建maven工程
3.1 创建一个空工程
创建后的空项目
3.2 创建跳过骨架的java项目
在空项目的基础上创建跳过骨架的java项目
创建完成
跳过骨架创建maven项目的项目目录结构最标准
3.3 创建有骨架的java项目
创建后的目录结构,相对标准的目录结构少了,resources文件目录
添加resources目录
3.4 创建有骨架的web项目
2.
3.
4.
5.新建成的有骨架的web项目缺少很多目录
6.按照上续创建resources目录的方法补全后:
4 maven项目中pom.xml的初略介绍
。。。。。。。。。。。。。。。。。。。。。
5 maven的常见指令
5.1 clean命令
清除编译产生的target文件内容,可以配合相应命令一起使用,如:mvn clean package。
target目录被清除了
5.2 compile命令
该命令可以对src/main/java目录进行编译,生成.class文件
5.3 test命令
测试命令:一键测试src/test/java 下Junit的测试用例,减少挨个测试方法的麻烦
5.4 package命令
5.4.1 对java项目打包
5.4.2 对web项目打包
修改包名:
5.5 install命令
打包后将其安装到本地仓库
安装完毕后,可以在本地仓库中找到 对应的项目
6 依赖
6.1 maven插件
maven是一个核心引擎,提供了基本的项目处理能力和建设过程的管理,以及一系列的插件是用来执行实际建设任务。
maven插件可以完成一些特定功能。例如:集成jdk插件可以方便的修改项目的编译环境;集成tomcat插件后,无需安装tomcat服务器就可以运行tomcat进行项目的发布和测试。在pom.xml中通过plugin标签引入maven的功能插件
6.1.1 jdk编译版本的插件
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
6.1.2 tomcat插件
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--配置端口号-->
<port>80</port>
<!--配置项目路径-->
<path>/day1003</path>
</configuration>
</plugin>
运行:
tomcat 插件注意问题: Maven的中央仓库中只有tomcat7.X版本,如果想使用tomcat8.X版本,需要从第三方仓库查找或者使用idea集成外部的tomcat插件
6.2 导入依赖
6.2.1 导入Junit坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
即可进行代码测试
6.2.2 导入servlet的依赖
导入servlet的坐标依赖
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
6.3 依赖的范围
依赖除了坐标之外,还有和标签用于标记此依赖的作用范围
用图说话:
6.4 继承
6.4.1 创建父模块和子模块
删除src目录,父目录只用来作pom.xml文件的继承
父模块的依赖包:
如果依赖版本不存在,可点击自动导入
创建子模块
子模板继承父模板依赖
6.5 版本管理
方便后期更改jar包和插件的版本,通常要提取出来
6.6 依赖管理
子模块虽然可以继承父模块所有的jar包, 但是 子模块只需要使用一个jar包, 把所有的jar包都给子模块是否合理?
添加标签
父模板:
添加管理后,父模板将不显示依赖
子模版:
子模版如果需要父模板的依赖,添写坐标的和依赖名即可,无需添加版本号,版本号统一由父模块管理
如果子模块不需要父模块的版本号的依赖,自行修改即可,依赖会优先使用近的依赖,如下图
6.7 排除依赖
这里拿子模块2为例,子模块2引入了子模块1的依赖,但需排除子模块1中的mysql依赖
引入标签
6.8 聚合
6.8.1 问题一安装子模版时报错
**原因:**因为父模板未安装,子模版找不到父模板的安装依赖
**解决方式:**先安装父模板即可
6.8.2 问题二如果有很多子模块,一个一个安装太麻烦
**解决方式:**使用聚合
聚合目的: 可以快速构建一个项目的多个模块
父模块的pom文件文件:
7 一些常见问题
1 tomcat插件重复启动:导致端口占用
2 index.html放到WEB-INF下面,导致访问不到这个html页面
3 名称不叫index.html,结果直接输入localhost:8080,访问不到这个页面