一、Maven 基础核心笔记 (v3.6+)
Maven 不仅是构建工具,更是一个项目管理与依赖管理(Jar包管理)的标准化平台,作用是:
1、通过pom.xml文件方便依赖的管理
2、提供统一的项目结构
3、提供标准项目构建流程:编译-测试-打包-发布
1. 核心概念:坐标与仓库
- 坐标 (GAV):唯一标识一个Jar包。
groupId:组织/公司(反写域名,如com.alibaba)。artifactId:项目名称(如fastjson)。version:版本号(如2.0.25,快照版带-SNAPSHOT)。
- 仓库 (Repository):
- 本地仓库:本地磁盘目录(默认
~/.m2/repository)。 - 私服:公司内部Nexus,加速下载并部署内部包。
- 中央仓库:Maven官方仓库,终极源。
- 本地仓库:本地磁盘目录(默认
2. 依赖管理 (Dependency Scope)
这是面试和生产中最容易踩坑的地方。记住下表:
| Scope | 编译classpath | 测试classpath | 运行classpath | 传递性 | 典型例子 |
|---|---|---|---|---|---|
| compile (默认) | ✅ | ✅ | ✅ | ✅ | spring-core |
| provided | ✅ | ✅ | ❌ | ❌ | lombok, servlet-api |
| runtime | ❌ | ✅ | ✅ | ✅ | mysql-connector |
| test | ❌ | ✅ | ❌ | ❌ | junit |
| system | ✅ | ✅ | ❌ | ❌ | 外部本地Jar(已废弃) |
高级技巧:引入
lombok务必用provided,防止编译后打入业务包导致冲突;引入Servlet/JSP API务必用provided,因为Tomcat容器中已有。
3. 生命周期 (Lifecycle) 与常用命令
Maven有三套独立的生命周期:clean、default(构建)、site(文档)。
default 生命周期核心阶段(按顺序执行):
validate:验证项目结构。compile:编译src/main/java到target/classes。test:执行src/test/java的单元测试(遇到失败会中断构建)。package:打包(Jar/War/Ear)。verify:对集成测试结果做检查。install:将打好的包安装到本地仓库(供其他本地项目依赖)。deploy:将打好的包上传到远程私服(供团队共享)。
常用组合技:
# 清空并重新编译打包(跳过测试)
mvn clean package -DskipTests
# 只打包,不执行测试(但会编译测试类)
mvn clean package -Dmaven.test.skip=true
# 安装到本地,供其他模块引用
mvn clean install
# 查看当前项目所有依赖树(排查冲突神技)
mvn dependency:tree
# 强制更新快照版SNAPSHOT依赖
mvn clean install -U
4. POM.xml 关键标签(工程实战)
<properties>
<!-- 统一JDK版本 -->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<!-- 统一版本管理,配合dependencyManagement使用 -->
<springboot.version>3.1.5</springboot.version>
</properties>
<dependencyManagement>
<!-- 在此定义版本,子模块继承,只声明不引入 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope> <!-- BOM引入方式 -->
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>my-app</finalName> <!-- 打包后的文件名 -->
<plugins>
<!-- 打可执行Jar包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
二、HTTP 协议核心笔记 (1.1/2)
HTTP是应用层协议,基于TCP/IP。其核心精髓是无状态、请求-响应模型。
1. 请求协议 (Request) 结构拆解
一个标准的HTTP请求由四部分组成:请求行、请求头、空行、请求体。
A. 请求行 (Request Line)
格式:Method + URL(Path+Query) + Protocol/Version
- 示例:
GET /api/user?id=1001&name=jack HTTP/1.1
B. 8种请求方法 (重点关注5种)
| 方法 | 幂等性 | 安全性 | 语义(后端工程师理解) |
|---|---|---|---|
| GET | ✅ | ✅ | 获取资源,参数拼接URL(长度受限),浏览器会缓存。 |
| POST | ❌ | ❌ | 新增资源,参数在Body中,不缓存。 |
| PUT | ✅ | ❌ | 全量更新资源(需传完整实体)。 |
| PATCH | ❌ | ❌ | 部分更新资源(传啥改啥,非幂等)。 |
| DELETE | ✅ | ❌ | 删除资源。 |
C. 常见请求头 (Header) 详解
Host:目标域名(HTTP/1.1强制必须)。User-Agent:客户端信息(浏览器/爬虫/Postman)。Accept:客户端能接收的MIME类型(如application/json)。Content-Type:请求体格式(最重要):application/json:RESTful API主流(前端传对象)。application/x-www-form-urlencoded:表单提交(key=val&key2=val2)。multipart/form-data:文件上传(分块boundary分隔)。
Authorization:身份凭证(如Bearer <JWT>)。Cookie:携带状态数据(Session ID)。If-None-Match/If-Modified-Since:配合缓存(304协商缓存)。
2. 响应协议 (Response) 结构拆解
由四部分组成:状态行、响应头、空行、响应体。
A. 状态行 (Status Line)
格式:Protocol/Version + Status Code + Reason Phrase
- 示例:
HTTP/1.1 200 OK
B. 必须背下来的状态码分类(面试必考)
| 分类 | 范围 | 核心含义 | 典型代表 |
|---|---|---|---|
| 1xx 信息 | 100-103 | 服务端收到请求,需继续操作 | 101 Switching Protocols (WebSocket握手) |
| 2xx 成功 | 200-206 | 请求成功 | 200 OK,201 Created(POST新建成功) |
| 3xx 重定向 | 300-308 | 资源位置变了 | 301永久重定向(搜索引擎会换链接),302临时重定向,304未修改(走缓存) |
| 4xx 客户端错误 | 400-418 | 前端/调用方问题 | 400参数错误,401未认证,403鉴权失败(没有权限),404资源不存在,405方法不允许 |
| 5xx 服务端错误 | 500-511 | 后端内部问题 | 500内部异常(空指针),502网关错误(上游挂了),503服务不可用(过载) |
工程师经验:看到
400先检查字段类型和Json格式;看到401检查Token是否过期;看到500立刻去看服务端异常日志。
C. 常见响应头
Content-Type:返回内容的类型(如application/json; charset=utf-8)。Content-Length:响应体的大小(字节)。Set-Cookie:服务端发指令让浏览器存Cookie。Cache-Control:缓存策略(如max-age=3600)。Location:结合301/302使用,指示新地址。
三、Maven + HTTP 综合实战坑点
- Maven 下载 HTTP 依赖报错:Maven 3.8.1+ 默认禁用了 HTTP 协议的中央仓库(必须HTTPS),若公司私服是HTTP,需在
settings.xml的mirror配置中添加<allowInsecure>true</allowInsecure>。 - 大文件上传接口超时:除了网关层设置超时,HTTP请求头要加上
Connection: keep-alive和合适的Transfer-Encoding: chunked。 - Maven 依赖冲突导致的
NoSuchMethodError:使用mvn dependency:tree查找谁引入了旧版本,然后用<exclusions>标签排除。
Comments NOTHING