Maven入门
是Apache开发的一个工具,用来管理Java项目,依赖管理,项目构建
Maven的作用
- 依赖管理:Maven对项目的第三方构建(jar包)进行统一管理,向工程中加入jar包不需要手工从其他地方拷贝,通过Maven定义jar包的坐标,自动从Maven仓库中下载到工程中
- 项目构建:Maven提供一套对项目周期管理的标准,开发人员和测试人员统一使用Maven进行项目构建,项目生命周期管理:编译、测试、打包、部署、运行
- Maven对工程分模块构建,提高开发效率
Maven中存放的内容
- Maven自身运行所需的插件
- 第三方框架和工具类的jar包
- 我们自己开发的Maven项目安装后的jar包
Maven的坐标
Maven的核心作用就是管理项目的依赖,引入我们所需的各种jar包,在Maven中,无论是一个依赖,插件或者项目构件的输出,都能够称之为构件
为了能够自动化解析任何一个Java构件,Maven必须将这些jar包或者其他资源进行唯一标识,这是管理项目的依赖基础,也就是坐标,坐标的定义元素如下:groupid(一般为公司组织名称), artifactid(项目名称), version(版本)
Maven仓库
Maven仓库有三种类型:
- 本地仓库,在你第一次运行任何 maven 命令的时候创建的,Maven 本地仓库保存你的工程的所有依赖(library jar、plugin jar等)。当你运行一次 Maven 构建,Maven 会自动下载所有依赖的 jar 文件到本地仓库中。它避免了每次构建时都引用远程机器上的依赖文件
- 中央仓库,Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量也是最全面的常用的资源
- 远程仓库,如果 Maven 在中央仓库中也找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的库文件
解决Marven test时出现Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile)的错误
造成原因:新建Maven项目时,jre默认使用的12,改成1.8后(即与jdk一致),即可运行
⚠️ 测试报告里不要使用中文,否则会乱码
创建Servlet项目
点击File
->New
->Project
,选择Maven工程,注意选择以webapp结尾的maven项目
修改项目的包名
然后修改Maven配置文件地址和Maven仓库地址
由于默认创建的工程没有java
、等文件,自己把相关文件夹和包创建一下
然后添加Tomcat插件
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
<path>/MyServlet</path>
</configuration>
</plugin>
</plugins>
配置Html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>TIM's First Web</h1>
</body>
</html>
运行Tomcat
成功
然后Java文件下新建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>
这时候简单实现Servlet.java文件
@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
但是发现,在点进Servlet后会报404的错
Debug了很久,发现能导致404的原因五花八门,在经过一番尝试后发现,问题出在@WebServlet语句,将其更改为
@WebServlet(name="Servlet",urlPatterns={"/Servlet"})
后,就能成功运行了
Maven常见命令
- clean 删除target/
- test test case junit/testNG
- package 打包
- install 把项目install到local repo
- deploy 发本地jar发布到remote
Maven依赖
依赖是Maven 中最关键的部分,我们之所以在工程中使用Maven,就是因为它的依赖管理功能。如果我们想要在工程中引入某个jar 包,只需要在pom.xml
中引入其jar 包的坐标即可,Maven 通过groupId
、artifactId
与version
三个向量来定位Maven 仓库其jar 包所在的位置,并把对应的jar 包引入到工程中来
依赖传递的范围:根据Jar包的不同,需要为其设置不同的传递方式,即传递范围。Maven中的依赖传递范围设置在<scope>标签中。它提供了六种依赖的范围:compile
、test
、provided
、runtime
、system
和import,
其中compile
是默认的依赖范围。
依赖关系的分类:
A.直接依赖:项目A要用到别的项目B的架构的东西,所以项目A直接依赖B项目
B.间接依赖:项目B依赖A,C依赖B,那么C间接依赖A
C.依赖传递性:Maven的依赖是具有传递性的,比如A->B,B->C,那么A间接的依赖于C,这就是依赖的传递性,其中A对于B是第一直接依赖,B对于C是第二直接依赖,C为A的传递性依赖。
D.可选依赖与排除依赖:传递性依赖会给项目隐式的引入很多依赖,这极大的简化了项目依赖的管理,但是有些时候这种特性也会带来问题,它可能会把我们不需要的jar包也引入到了工程当中,使项目结构变得更复杂。或者你想替换掉默认的依赖换成自己想要的jar包,这时候就需要用到依赖排除。
Maven的继承与聚合
Maven的聚合特性:可以帮助我们把项目的多个模块聚合在一起,使用一条命令进行构建,即一条命令实现构建多个项目;
Maven的继承特性:可以将各个模块相同的依赖和插件配置提取出来,在简化POM的同时还可以促进各个模块配置的一致性。
聚合和继承的关系:虽然聚合模块和父模块经常合二为一,但是聚合和继承是两个不同的概念,其实是没有什么关系的。聚合模块知道它聚合了哪些模块,但是被聚合的模块不知道聚合模块的存在;父模块不知道子模块的存在,但是子模块都必须知道自己的父模块是谁。