javaweb-Day04-Maven&Http协议

TJCcc 发布于 20 天前 19 次阅读


一、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
providedlombok, servlet-api
runtimemysql-connector
testjunit
system外部本地Jar(已废弃)

高级技巧:引入 lombok 务必用 provided,防止编译后打入业务包导致冲突;引入Servlet/JSP API务必用 provided,因为Tomcat容器中已有。

3. 生命周期 (Lifecycle) 与常用命令

Maven有三套独立的生命周期:cleandefault(构建)、site(文档)。

default 生命周期核心阶段(按顺序执行)

  1. validate:验证项目结构。
  2. compile:编译 src/main/javatarget/classes
  3. test:执行 src/test/java 的单元测试(遇到失败会中断构建)。
  4. package:打包(Jar/War/Ear)。
  5. verify:对集成测试结果做检查。
  6. install:将打好的包安装到本地仓库(供其他本地项目依赖)。
  7. 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 OK201 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 综合实战坑点

  1. Maven 下载 HTTP 依赖报错:Maven 3.8.1+ 默认禁用了 HTTP 协议的中央仓库(必须HTTPS),若公司私服是HTTP,需在 settings.xmlmirror 配置中添加 <allowInsecure>true</allowInsecure>
  2. 大文件上传接口超时:除了网关层设置超时,HTTP请求头要加上 Connection: keep-alive 和合适的 Transfer-Encoding: chunked
  3. Maven 依赖冲突导致的 NoSuchMethodError:使用 mvn dependency:tree 查找谁引入了旧版本,然后用 <exclusions> 标签排除。
唯有极致沉淀,才能造就辉煌。
最后更新于 2026-08-03