文章目录
5. Maven
为什么要学?
先去查一查自己的IDEA版本和最高能兼容那个版本的maven
- IDEA 2021 兼容maven 3.8.1及之前的所用版本
- IDEA 2020 兼容Maven 3.6.3及之前所有版本
1.在javaweb开发中,需要使用大量的jar包,我们手动去导入会很麻烦
2.那么如何能够让一个东西自动帮我们导入和配置这个jar包呢,Maven可以做到!
5.1 Maven项目构建管理工具
Maven的核心思想:约定大于配置!约定大于配置!约定大于配置!
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
- 有约束,不要去违反!
5.2 下载安装
- 环境搭建
这里我下载版本为3.8.1的:https://archive.apache.org/dist/maven/maven-3/3.8.1/source/
下载完成后解压到电脑环境目录下即可!
5.3 配置环境变量
在我们的系统环境变量中,添加如下的配置:
- M2_HOME maven目录下的**bin目录 ** (注意:这里写成M2_HOME是因为在后面的学习中有用到,方便日后使用!)
- MAVEN_HOME maven的目录
- 在path中引用:%MAVEN_HOME%\bin
配置成功!
5.4 阿里云镜像
-
作用:加速我们的下载
-
maven阿里云镜像->粘贴到mirror中
直接到阿里云镜像官网查看:https://developer.aliyun.com/mirror/maven?spm=a2c6h.13651102.0.0.7be81b11UzF1js
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
5.5 本地仓库
即在本地的仓库,也有远程仓库
- 建立一个本地仓库
在setting.xml中,配置这一项,要提前在apache-maven-3.8.1下建立maven-repo目录:
<localRepository>E:\Maven\apache-maven-3.8.1\maven-repo</localRepository>
5.6 在IDEA中使用Maven
- 在IDEA中使用Tomcat(回顾)
5.6.1步骤
- 关闭当前项目
- 在all setting下进入
- 找到maven
- 更改下图所示
- 不成功的话,更改成功
- 要解决的问题
方案一:默认创建maven项目是下载网络上的一个文件archetype-catalog.xml,该文件的大小有5-6M,下载的速度很慢,导致创建过程也变得很慢。所以我们需要配置一下。当然,这里解决的方法有三种,这里我选择最容易的一种,就是修改maven的VM Options参数配置。
方案二:创建Maven项目时,添加配置参数:-DarchetypeCatalog=internal
- 新建maven项目时选择
- 成功
5.6.2 配置
5.7 创建一个干净的maven项目
即:不使用模板创建!
下面这个是只在选择了web应用的模板才有的:
下面,我们选择干净的maven项目,在项目中的main目录下,创建java,resources目录
并把Java目录标记为源码目录,让其编程蓝色,可以编写代码
方法一:
5.8 标记文件夹功能
方法二:打开modules的标记文件夹功能进行标记
5.9 在IDEA中配置Tomcat
注意:
这个是没有使用webapp模板创建的干净的maven项目,如果使用的是含模板创建的Maven项目,从第6步开始可以选择war包,而不用像6-9那样去添加war包!
告诉 idea 使用的是 Tomcat 服务器
-
第1步
为 Tomcat 服务器设置开关 -
第2步
-
第3步
-
第4步
-
第5步 出现这个就说明对了
将网站交给Tomcat管理 -
第6步
-
第7步
添加工件
- 第8步
- 第9步
导入 Tomcat 的 jar 包
5.10 编辑pom.xml
-
添加依赖项
在build中配置resources节点,来防止我们资源导出失败的问题学习Mybatis会遇到 -
背景:
在Maven项目中,资源配置文件默认是放在resources目录下的。但有时我们在编写项目时,配置文件可能会被我们放置到别的目录,Maven由于它的约定大于配置,所以默认的maven项目在构建编译时不会把我们其他目录下的配置文件导出到target目录中,从而导致配置文件无法导出或者生效的问题。解决方案:在项目的pom.xml文件中手动配置资源过滤,让它把src/main/java目录下的.properties和.xml文件也能够被导出。
添加这一段:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
5.11 Servelt
- 首先到Tomcat的安装目录找到bin目录,启动Maven
- 访问examples目录下的例子:http://localhost:8080/examples/
看到:
点进去后,可以看到例子,这里我选择hello world例子,我们点击他的源码:
- 在idea中模仿编写这个案例
发现没有HttpServelt这个jar包,右键添加Maven依赖
但是,Maven中,也没有搜索到这个包,是因为我们第一次使用,本地仓库里面,也没有这个包
下面,我们去maven仓库找
5.12 maven仓库的使用
在 Maven 的术语中,仓库是一个位置(place)。Maven 在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
Maven 仓库有三种类型:
- 本地(local)
- 中央(central)
- 远程(remote)
注意:
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
仓库地址:https://mvnrepository.com/
发现搜不到:
进而联想到,Tomcat中的案例能够运行,那么我们就去Tomcat中的lib目录下去找相应的jar包,猜想:servlet相关的jar包
Tomcat中的lib目录:
复制代码,添加到项目依赖 pom.xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<!-- scope作用域:生产 把他注释掉-->
<!-- <scope>provided</scope>-->
</dependency>
刷新一下maven,然后打开依赖项:
- 导入我们的包
- 好了可以写代码了
代码:
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应的类型:html
resp.setContentType("text/html");
//获取响应的输出流
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
下面会介绍怎么访问到这个servlet里面的代码,输出 helloworld!
5.13 配置web.xml
首先:
- 然后启动Tomcat,默认访问的是index.jsp
- 那么,如何访问webapp下的html文件呢?
先新建:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<h1>
测试一下!
</h1>
</div>
</body>
</html>
在后面追加header.html,访问一下:http://localhost:8080/viraha/header.html
- 那么如何访问JSP中的代码,输出helloworld 呢?
我们现在来访问一下,访问servlet里面的helloworld:http://localhost:8080/viraha/jori
发现报错500
注意:由于这里我用到的Tomcat版本是Tomcat10 ,会报错!
解决方法是,有两个:
1 据了解,可以换成Tomcat9版本的,再重新配置一下就行了!
2 我们根据报错的提示,来得到下一种解决方法!
提示无法将**javax.servlet.http.HttpServlet 转化为jakarta.servlet.http.HttpServlet,**那么我们把 这个包替换掉就行!
或者将javax.servlet.http.HttpServlet这个包用jakarta.servlet.http.HttpServlet替换了,解决Tomcat10报500的问题!
方法:
到maven仓库中搜索:jakarta.servlet 注意,选择5.0.0
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
或者点这个链接进入,直接拷贝:
https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api/5.0.0
servelt代码替换成这个(替换这一段,免得报错!):
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应的类型:html
resp.setContentType("text/html");
//响应编码的类型
resp.setCharacterEncoding("utf-8");//识别中文
//获取响应的输出流
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>你好世界!</title>");//这里改动了
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World! 你好世界!</h1>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
接着访问:http://localhost:8080/viraha/jori
注意:这里是viraha,是因为在配置Tomcat时,这里加了虚拟路径的映射
jori是在配置web.xml的时候加的,看上面第一张图的请求路径!
虚拟路径的映射:
访问成功了: