<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Aiyezi</title><description>Demo Site</description><link>https://blog.aiyezi.top/</link><language>zh_CN</language><item><title>mysql基础</title><link>https://blog.aiyezi.top/posts/mysql%E5%9F%BA%E7%A1%80/</link><guid isPermaLink="true">https://blog.aiyezi.top/posts/mysql%E5%9F%BA%E7%A1%80/</guid><description>一些笔记关于mysql的基础知识</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;什么是 MySQL&lt;/h1&gt;
&lt;p&gt;MySQL 是一个高性能，开源的&lt;strong&gt;关系型数据库管理系统&lt;/strong&gt; (RDBMS)。使用 SQL (Structured Query Language) 进行数据查询，数据以表的形式（行和列）进行存储。&lt;/p&gt;
&lt;p&gt;数据会以文件的形式存储到磁盘中，根据不同的存储引擎会有不同的存储策略，现在大多数是使用 InnoDB 引擎。&lt;/p&gt;
&lt;p&gt;但是如果每次数据操作都直接读写磁盘，效率会非常低，因此 InnoDB 会在内存中开辟一块称作&lt;strong&gt;缓冲池&lt;/strong&gt;的空间，每次读写操作都会通过缓冲池进行，大大的提高了效率。&lt;/p&gt;
&lt;h1&gt;核心概念&lt;/h1&gt;
&lt;p&gt;在 MySQL 的存储逻辑中，有几个核心的概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据库 (Database)&lt;/strong&gt;：存储和管理数据的容器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;表 (Table)&lt;/strong&gt;: 实际存放数据的结构，由行和列组成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行 (Row)&lt;/strong&gt;: 表示具体的一条数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;列 (Column) / 字段 (Field)&lt;/strong&gt;: 表示数据的属性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主键 (Primary Key)&lt;/strong&gt;: 一条数据的&lt;strong&gt;唯一&lt;/strong&gt;(不能重复)标识，不能为空&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外键 (Foreign Key)&lt;/strong&gt;: 用于在表与表之间建立联系的标识，通常是另一张表的主键或唯一键。当前表中通过外键记录关联表的主键值，从而建立联系&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;一些基础 SQL 语法&lt;/h1&gt;
&lt;h2&gt;DDL (Data Definition Language - 数据定义语言)&lt;/h2&gt;
&lt;p&gt;用于对数据库对象(比如数据库、表、视图、索引、存储) 进行增删改操作 (操作隐性提交，不能回滚)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- 1. 查看数据库
SHOW DATABASES;

-- 2. 创建一个名为 demo 的数据库
CREATE DATABASE demo;

-- 3. 切换到 demo 这个数据库 (后续能操作这个数据库)
USE demo;

-- 4. 显示当前数据库中的表
SHOW TABLES;

-- 5. 创建一张表
-- id 大整型(BIGINT) 设定为主键(PRIMARY KEY) 值自增(AUTO_INCREMENT)
-- name password 可变字符串(VARCHAR) 不能为空(NOT NULL)
-- create_time 时间戳(TIMESTAMP) 默认为数据创建时的时间(DEFAULT CURRENT_TIME)
CREATE TABLE users (
 id BIGINT PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(50) NOT NULL,
 password VARCHAR(50) NOT NULL,
 create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

-- 6. 查看表结构
DESCRIBE users; -- 也可以简写为 DESC users;

-- 7. 删除表
DROP TABLE users;

-- 8. 删除数据库
DROP DATABASE demo;

-- 9. 修改表结构
-- 10. 例如将 users 表中 password 改为 user_password 并且类型改为 varchar(32)
ALTER TABLE users CHANGE COLUMN password user_password VARCHAR(32) NOT NULL;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;DML (Data Manipulation Language - 数据操作语言)&lt;/h2&gt;
&lt;p&gt;用于对表中的数据进行增、删、改操作&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- 1. 插入数据 (INSERT)
-- id 字段自增，可以不用填写 (实际上密码一般都是加密存储的)
-- create_time 字段有默认值，也可以不用填写
-- 注意：列名列表和 VALUES 中的值必须一一对应
INSERT INTO users (name, password) VALUES (&apos;admin&apos;, &apos;12345678&apos;);
-- 也可以直接插入
-- 但是必须提供所有字段，对于自增和有默认值的可以用 DEFAULT 让系统自动生成
INSERT INTO users VALUES (DEFAULT, &apos;user_001&apos;, &apos;87654321&apos;, DEFAULT);

-- 2. 修改数据 (UPDATE)
-- 将用户名为 &apos;admin&apos; 的用户密码改为 &apos;11223344&apos;
-- 如果不加 WHERE 限定会改掉所有用户的密码
UPDATE users SET password = &apos;11223344&apos; WHERE name = &apos;admin&apos;;

-- 3. 删除数据 (DELETE)
-- 删除名字为 &apos;user_001&apos; 的用户
-- 如果不加 WHERE 限定会删掉所有用户(DELETE FROM users -- 清空表，但保留表结构)
DELETE FROM users WHERE name = &apos;user_001&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;PS. 一定要注意 WHERE 的使用，一不小心就把整张表所有数据改掉了
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;DQL (Data Query Language - 数据查询语言)&lt;/h2&gt;
&lt;p&gt;用于查询数据库中的数据&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- 1. 查询所有行
SELECT * FROM users;

-- 2. 查询指定列 (又称投影查询)
SELECT name, password FROM users;

-- 3. 带条件查询 (WHERE)
SELECT * FROM users WHERE create_time &amp;gt; &apos;2026-02-23&apos;;

-- 4. 排序(ORDER BY 默认升序)
SELECT * FROM users ORDER BY create_time;
-- 降序 (DESC)
SELECT * FROM users ORDER BY create_time DESC;

-- 5. 限制返回行数 (LIMIT)
-- 只返回两行
SELECT * FROM users LIMIT 2;

-- 结合排序和限制，查询最早注册的用户
SELECT * FROM users ORDER BY create_time LIMIT 1;

-- 6. 模糊查询 (LIKE)
-- &apos;%&apos;代表匹配多个任意字符 &apos;_&apos;代表匹配一个任意字符
SELECT * FROM users WHERE name LIKE &apos;%d%&apos;;
SELECT * FROM users WHERE name LIKE &apos;__e%&apos;;

-- 7. 去重 (DISTINCT)
-- 查看有叫哪些名字的 (把重复的名字去掉了)
SELECT DISTINCT name FROM users;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;一些进阶 SQL 语法&lt;/h1&gt;
&lt;h2&gt;分页查询&lt;/h2&gt;
&lt;p&gt;在数据量很多的时候，进行大量查询时通常会进行分页操作&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- 基于 LIMIT 加上偏移量 OFFSET 进行分页操作
-- 没有加上 OFFSET 的时候其实就是相当于 OFFSET = 0
SELECT * FROM users LIMIT 5;
SELECT * FROM users LIMIT 5 OFFSET 0;

-- 正常我们看分页数据都是有两个指标：页长(pageSize)和页码(pageNum)
-- 页长就是每页有多少个数据，页码就是当前第几页
-- 本质上 LIMIT N 和 OFFSET M 的组合就是获取 范围为第M+1~M+N的所有数据
-- 页长和页码同偏移量之间的转换则就是: offset = pageSize * (pageNum - 1)
-- 例如当页长为10，查询第5页
SELECT * FROM users LIMIT 10 OFFSET 40;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;聚合查询&lt;/h2&gt;
&lt;p&gt;SQL 提供了一些用于统计和计算的聚合函数，例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- 用于统计数量的 COUNT()，其结果返回一个一行一列的二维表
-- 列名为填写的 COUNT(*) , 对应的数据为统计的数量
-- * 替换成表中其他字段效果也等同，都是统计这个表的行数
SELECT COUNT(*) FROM users;

-- 用于计算数值和的 SUM() 计算的字段必须为数值类型
-- 返回形式和COUNT()相似
-- 假设users 存在数值字段 age
-- 计算用户年龄总和 (好像没啥实际意义)
SELECT SUM(age) FROM users;

-- 用于计算最大值的 MAX()
-- 计算的字段不局限于数值，字符类型也可以，其大小以字典序决定
-- 返回形式同上
-- 计算用户的最大年龄
SELECT MAX(age) FROM users;

-- 用于计算最小值的 MIN()
-- 形式同 MAX()
SELECT MIN(age) FROM users;

-- 用于分组的 GROUP BY
-- 假设 users 存在角色字段 role
-- 这里的 num 是给结果列名 COUNT(*) 改名为 num 上述也能进行这种操作
-- 这里是将 users 按 role 分组后分别统计数量，结果返回一个多行一列的结果
-- 每行对应每个角色分组的统计数量
SELECT COUNT(*) num FROM users GROUP BY role;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;多表查询&lt;/h2&gt;
&lt;p&gt;SELECT 查询可以从多张表同时查询数据，实际业务上也是多表查询居多&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- 1. 直接多表查询
-- 直接查询多个表
-- 返回一个 users 和 roles 表的&quot;乘积表&quot; (集合论中的笛卡尔积)
SELECT * FROM users, roles;

-- 直接查询多个表的指定字段的
-- 就是上面那个乘积里选出几列
-- 指定字段用了【表名.字段名】的形式表示具体指哪个表中的字段
-- 这里用了在数据对象后面取别名的方法，在复杂查询中能简化许多
SELECT
 u.id uid, u.name uname, r.id rid, r.name rname
FROM
 users u, roles r;

-- 2. 内连接多表查询
-- 假设 roles 表存储 (id, user_id, role_name)
-- 现在要查询出用户信息和对应的角色的表
-- 使用 INNER JOIN 进行连接，结果会返回上述&quot;乘积&quot;中，符合 u.id = r.user_id的
SELECT
 u.id, u.name, u.password ,r.role_name
FROM
 users u INNER JOIN roles r
ON
 u.id = r.user_id;

-- 3. 外连接多表查询
-- 外连接有左外连接(LEFT JOIN),右外连接(RIGHT JOIN)查询 (外 OUTER 通常会被省略)
-- 对于左外连接，就是以左表为主表，将右表存在关联的数据连接上，其他用 NULL 补全
SELECT
 u.id, u.name, u.password ,r.role_name
FROM
 users u LEFT JOIN roles r
ON
 u.id = r.user_id;
-- 对于右外连接，则是以右表为主表，将左表存在关联的数据连接上，其他用 NULL 补全
SELECT
 u.id, u.name, u.password, r.role_name
FROM
 users u RIGHT JOIN rules r
ON
 u.id = r.user_id;
-- 以及全外连接 (FULL JOIN)，但是在 Mysql 里没有这个语法
-- 实际上相当于将 左右连接 UNION 起来
SELECT
 u.id, u.name, u.password, r.role_name
FROM
 users u Left JOIN rules r
ON
 u.id = r.user_id
UNION
SELECT
 u.id, u.name, u.password, r.role_name
FROM
 users u RIGHT JOIN rules r
ON
 u.id = r.user_id;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Maven 以及 pom</title><link>https://blog.aiyezi.top/posts/maven%E4%BB%A5%E5%8F%8Apom/</link><guid isPermaLink="true">https://blog.aiyezi.top/posts/maven%E4%BB%A5%E5%8F%8Apom/</guid><description>学习Maven的一些笔记</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Maven 是一个项目管理和构建的自动化工具，主要服务于 JAVA 项目。其特性在于&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准化项目管理 (统一的项目目录结构)&lt;/li&gt;
&lt;li&gt;依赖管理 (自动管理第三方库及其版本、传递性依赖)&lt;/li&gt;
&lt;li&gt;构建生命周期 (标准的构建流程-编译、测试、打包、部署)&lt;/li&gt;
&lt;li&gt;插件机制 (通过插件扩展功能)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;code&gt;pom.xml&lt;/code&gt; 详解&lt;/h1&gt;
&lt;p&gt;POM (Project Object Model) 是 Maven 的核心配置，定义了项目的基本信息、依赖、构建配置等。&lt;/p&gt;
&lt;h2&gt;基础结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;

    &amp;lt;!-- POM 版本，通常固定为 4.0.0 --&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

    &amp;lt;!-- 项目坐标：唯一标识一个项目 --&amp;gt;
    &amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;           &amp;lt;!-- 组织/公司标识 --&amp;gt;
    &amp;lt;artifactId&amp;gt;my-app&amp;lt;/artifactId&amp;gt;          &amp;lt;!-- 项目名称 --&amp;gt;
    &amp;lt;version&amp;gt;1.0.0-SNAPSHOT&amp;lt;/version&amp;gt;        &amp;lt;!-- 项目版本 --&amp;gt;
    &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;               &amp;lt;!-- 打包方式：jar/war/pom等 --&amp;gt;

&amp;lt;/project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;坐标详解&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;元素&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;groupId&lt;/td&gt;
&lt;td&gt;组织标识，通常为域名倒写&lt;/td&gt;
&lt;td&gt;com.example, cc.ieaf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;artifactId&lt;/td&gt;
&lt;td&gt;项目唯一标识&lt;/td&gt;
&lt;td&gt;my-app, springsecurity-demo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;version&lt;/td&gt;
&lt;td&gt;项目版本号&lt;/td&gt;
&lt;td&gt;1.0.0, 2.0.0-beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;packaging&lt;/td&gt;
&lt;td&gt;打包方式 (可选)&lt;/td&gt;
&lt;td&gt;jar, war, pom, maven-plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;classifier&lt;/td&gt;
&lt;td&gt;分类器 (可选)&lt;/td&gt;
&lt;td&gt;sources, javadoc&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;版本号规范&lt;/h3&gt;
&lt;p&gt;Maven 版本号规范允许使用&lt;strong&gt;数字、点、连字符、下划线、字母&lt;/strong&gt;的组合。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;version&amp;gt;2.5.6.RELEASE&amp;lt;/version&amp;gt;   &amp;lt;!-- Spring 传统格式 --&amp;gt;
&amp;lt;version&amp;gt;2.5.6&amp;lt;/version&amp;gt;     &amp;lt;!-- 纯数字格式 --&amp;gt;
&amp;lt;version&amp;gt;2.5.6-Final&amp;lt;/version&amp;gt;    &amp;lt;!-- 带标识符 --&amp;gt;
&amp;lt;version&amp;gt;2.5.6.20201231.123456&amp;lt;/version&amp;gt; &amp;lt;!-- 时间戳版本 --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;版本号排序规则&lt;/strong&gt;（从小到大）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;2.5.6-SNAPSHOT&lt;/code&gt; (开发版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2.5.6-alpha&lt;/code&gt; (内测版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2.5.6-beta&lt;/code&gt; (公测版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2.5.6-milestone&lt;/code&gt; (里程碑版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2.5.6.RELEASE&lt;/code&gt; 或 &lt;code&gt;2.5.6&lt;/code&gt; (正式版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2.5.6.RELEASE.1&lt;/code&gt; (补丁版)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;依赖管理&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;dependencies&amp;gt;
    &amp;lt;!-- 一个依赖项 --&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;!-- 组织标识 --&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
        &amp;lt;!-- 项目唯一标识 --&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
        &amp;lt;!-- 项目版本号 --&amp;gt;
        &amp;lt;version&amp;gt;2.7.0&amp;lt;/version&amp;gt;
        &amp;lt;!-- 依赖范围 --&amp;gt;
        &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
        &amp;lt;!-- 是否可选 --&amp;gt;
        &amp;lt;optional&amp;gt;false&amp;lt;/optional&amp;gt;
        &amp;lt;!-- 排除传递性依赖 --&amp;gt;
        &amp;lt;exclusions&amp;gt;
            &amp;lt;exclusion&amp;gt;
                &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;spring-boot-starter-logging&amp;lt;/artifactId&amp;gt;
            &amp;lt;/exclusion&amp;gt;
        &amp;lt;/exclusions&amp;gt;
    &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;依赖范围 (scope)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;范围&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;compile&lt;/td&gt;
&lt;td&gt;默认值，所有阶段都有效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;provided&lt;/td&gt;
&lt;td&gt;编译时有效，运行时由 JDK 或容器提供&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;runtime&lt;/td&gt;
&lt;td&gt;编译时不需要，运行时需要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test&lt;/td&gt;
&lt;td&gt;测试时需要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;system&lt;/td&gt;
&lt;td&gt;类似 provided 需要显式指定路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;import&lt;/td&gt;
&lt;td&gt;仅用于 dependencyManagement, 导入依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;是否可选 (optional)&lt;/h3&gt;
&lt;p&gt;这个选项表示这个依赖是否应该被传递继承&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;optional=true&lt;/code&gt;: 表示当前项目需要这个依赖，但是不强制要求引用我这个项目的使用者也被传递需要这个依赖&lt;/li&gt;
&lt;li&gt;&lt;code&gt;optional=false&lt;/code&gt;: （&lt;strong&gt;默认值&lt;/strong&gt;）表示当前项目需要这个依赖，同时引用我这个项目的使用者也会自动获得这个依赖
举个例子：我写一个项目的时候用到了 &lt;code&gt;lombok&lt;/code&gt;, 但是它仅在我编译代码的时候需要，如果别人要使用我写的包不一定就需要它，这种时候就可以使用 &lt;code&gt;optional=true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;属性配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;properties&amp;gt;
    &amp;lt;!-- 项目编码 --&amp;gt;
    &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
    &amp;lt;project.reporting.outputEncoding&amp;gt;UTF-8&amp;lt;/project.reporting.outputEncoding&amp;gt;

    &amp;lt;!-- Java 版本 --&amp;gt;
    &amp;lt;maven.compiler.source&amp;gt;11&amp;lt;/maven.compiler.source&amp;gt;
    &amp;lt;maven.compiler.target&amp;gt;11&amp;lt;/maven.compiler.target&amp;gt;

    &amp;lt;!-- 自定义属性：统一版本管理 --&amp;gt;
    &amp;lt;spring.version&amp;gt;5.3.20&amp;lt;/spring.version&amp;gt;
    &amp;lt;junit.version&amp;gt;5.8.2&amp;lt;/junit.version&amp;gt;
&amp;lt;/properties&amp;gt;

&amp;lt;!-- 使用属性 --&amp;gt;
&amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置属性中，一些是内置属性，直接配置使用。一些是自定义配置，需要自己在用到的地方通过 &lt;code&gt;${spring.version}&lt;/code&gt; 这样的形式进行引用。&lt;/p&gt;
&lt;h3&gt;常见的内置属性&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性名&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;示例值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project.build.sourceEncoding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;源码编码&lt;/td&gt;
&lt;td&gt;UTF-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project.reporting.outputEncoding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;报告编码&lt;/td&gt;
&lt;td&gt;UTF-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven.compiler.source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java 源码版本&lt;/td&gt;
&lt;td&gt;1.8,11,17,21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven.compiler.target&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java 目标版本&lt;/td&gt;
&lt;td&gt;1.8,11,17,21&amp;lt;br&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven.test.skip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否跳过测试&lt;/td&gt;
&lt;td&gt;true/false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven.javadoc.skip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否跳过javadoc&lt;/td&gt;
&lt;td&gt;true/false&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;构建配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;build&amp;gt;
    &amp;lt;!-- 最终打包的文件名--&amp;gt;
    &amp;lt;!-- 不写的话，默认就是这个命名 --&amp;gt;
    &amp;lt;finalName&amp;gt;${project.artifactId}-${project.version}&amp;lt;/finalName&amp;gt;

    &amp;lt;!-- 资源配置文文件 --&amp;gt;
    &amp;lt;!-- 不写的话，资源文件路径默认是下面这个 --&amp;gt;
    &amp;lt;!-- filtering 默认是 false --&amp;gt;
    &amp;lt;!-- 但是包含的文件默认是所有，下面限定了.yaml和.xml后缀的 --&amp;gt;
    &amp;lt;resources&amp;gt;
        &amp;lt;resource&amp;gt;
            &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt;
            &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt;
            &amp;lt;includes&amp;gt;
                &amp;lt;include&amp;gt;**/*.yaml&amp;lt;/include&amp;gt;
                &amp;lt;include&amp;gt;**/*.xml&amp;lt;/include&amp;gt;
            &amp;lt;/includes&amp;gt;
        &amp;lt;/resource&amp;gt;
    &amp;lt;/resources&amp;gt;

    &amp;lt;!-- 插件配置 --&amp;gt;
    &amp;lt;plugins&amp;gt;
        &amp;lt;plugin&amp;gt;
            &amp;lt;!-- 和上述依赖类似 --&amp;gt;
            &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;3.10.1&amp;lt;/version&amp;gt;
            &amp;lt;!-- 插件的具体配置，要根据插件决定 --&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;source&amp;gt;11&amp;lt;/source&amp;gt;
                &amp;lt;target&amp;gt;11&amp;lt;/target&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/plugin&amp;gt;

        &amp;lt;plugin&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;!-- 和依赖类似，可以排除传递包 --&amp;gt;
                &amp;lt;excludes&amp;gt;
                    &amp;lt;exclude&amp;gt;
                        &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
                    &amp;lt;/exclude&amp;gt;
                &amp;lt;/excludes&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
&amp;lt;/build&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;filtering=true&lt;/code&gt; 的作用: 允许在构建时替换资源文件中的占位符，例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# src/main/resources/application.yaml
app:
  name: ${project.name}
  version: ${project.version}
  env: ${env}
  url: ${db.url}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用来替换这些占位符的可以来自 &lt;code&gt;pom.xml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;properties&amp;gt;
 &amp;lt;!-- 可以是内置属性 --&amp;gt;
 &amp;lt;project.version&amp;gt;1.0.0&amp;lt;/project.version&amp;gt;

 &amp;lt;!-- 也可以是自定义属性 --&amp;gt;
    &amp;lt;env&amp;gt;dev&amp;lt;/env&amp;gt;
&amp;lt;/properties&amp;gt;

&amp;lt;build&amp;gt;
    &amp;lt;ressources&amp;gt;
        &amp;lt;resource&amp;gt;
            &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt;
            &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt;
        &amp;lt;/resource&amp;gt;
    &amp;lt;/ressources&amp;gt;
&amp;lt;/build&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;也可以用命令行，通过 &lt;code&gt;-D参数&lt;/code&gt; 传递&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mvn package -ddb.url=jdbc:mysql://localhost:3306/test
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;还可以是来自系统变量
例如系统变量里有 &lt;code&gt;$OPENAI_API=sk...&lt;/code&gt;，在资源文件里也能使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# src/main/resources/application.yaml
openai_api: ${OPENAI_API}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;仓库配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 定义项目特有的仓库 --&amp;gt;
&amp;lt;repositories&amp;gt;
    &amp;lt;repository&amp;gt;
        &amp;lt;id&amp;gt;aliyun&amp;lt;/id&amp;gt;
        &amp;lt;name&amp;gt;阿里云仓库&amp;lt;/name&amp;gt;
        &amp;lt;url&amp;gt;https://maven.aliyun.com/repository/public&amp;lt;/url&amp;gt;
  &amp;lt;!-- 允许使用正式发行版本 --&amp;gt;
        &amp;lt;releases&amp;gt;
            &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;
        &amp;lt;/releases&amp;gt;
  &amp;lt;!-- 禁止使用开发快照版本 --&amp;gt;
        &amp;lt;snapshots&amp;gt;
            &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;
        &amp;lt;/snapshots&amp;gt;
    &amp;lt;/repository&amp;gt;
&amp;lt;/repositories&amp;gt;

&amp;lt;!-- 插件仓库 --&amp;gt;
&amp;lt;pluginRepositories&amp;gt;
    &amp;lt;pluginRepository&amp;gt;
        &amp;lt;id&amp;gt;aliyun-plugin&amp;lt;/id&amp;gt;
        &amp;lt;url&amp;gt;https://maven.aliyun.com/repository/public&amp;lt;/url&amp;gt;
    &amp;lt;/pluginRepository&amp;gt;
&amp;lt;/pluginRepositories&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用于自定义项目的依赖仓库和插件仓库，一般不使用，通常是在 Maven 的 &lt;code&gt;settings.xml&lt;/code&gt; 文件里配置。&lt;/p&gt;
&lt;h2&gt;多模块项目&lt;/h2&gt;
&lt;p&gt;大多数时候一些大型项目会分成多个模块构建，减小项目的耦合性，增大开发效率和灵活性。其实就是把项目里的文件分散到几个独立的模块里去：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spring-boot-multi-module/
├── pom.xml (父)
├── common/
│   ├── pom.xml
│   └── src/main/java/com/example/common/...
├── service/
│   ├── pom.xml
│   └── src/main/java/com/example/service/...
└── web/
    ├── pom.xml
    └── src/main/java/com/example/web/Application.java
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;父POM (聚合模块)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 父模块定义 --&amp;gt;
&amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;parent-project&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt;

&amp;lt;!-- 定义子模块 --&amp;gt;
&amp;lt;module&amp;gt;common&amp;lt;/module&amp;gt;
&amp;lt;module&amp;gt;core&amp;lt;/module&amp;gt;
&amp;lt;module&amp;gt;web&amp;lt;/module&amp;gt;

&amp;lt;!-- 子模块公用配置 --&amp;gt;
&amp;lt;properties&amp;gt;
    &amp;lt;java.version&amp;gt;11&amp;lt;/java.version&amp;gt;
&amp;lt;/properties&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;子 POM&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;parent&amp;gt;
    &amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;parent-project&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
    &amp;lt;relativePath&amp;gt;../pom.xml&amp;lt;/relativePath&amp;gt;
&amp;lt;/parent&amp;gt;

&amp;lt;artifactId&amp;gt;common&amp;lt;/artifactId&amp;gt;
&amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Maven 是基于坐标识别项目，所以显式地声明父模块的 groupId、artifactId、version 是必须的。&lt;/li&gt;
&lt;li&gt;子模块通过 &lt;code&gt;&amp;lt;parent&amp;gt;&lt;/code&gt; 声明继承了父模块的 groupId、artifactId、version 等。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relativePath&lt;/code&gt; 只是一个辅助提示，如果没找到 Maven 会转而去依赖仓库中去寻找&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;多模块依赖管理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 通常用在父POM中 --&amp;gt;
&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-boot-dependencies&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;2.7.0&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;

        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.google.guava&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;guava&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;31.1-jre&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;dependencyManagement&lt;/code&gt; 中的是声明的依赖版本，可以让子模块引用时无需声明版本，而在子模块里的 &lt;code&gt;dependencies&lt;/code&gt; 一般则是直接引入的依赖。&lt;/p&gt;
&lt;h2&gt;常用插件&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;插件&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;常用命令&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-compiler-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;编译Java代码&lt;/td&gt;
&lt;td&gt;compile, testCompile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-surefire-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;运行单元测试&lt;/td&gt;
&lt;td&gt;test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-jar-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;打包成JAR&lt;/td&gt;
&lt;td&gt;package&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-war-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;打包成WAR&lt;/td&gt;
&lt;td&gt;package&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-source-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;生成源码包&lt;/td&gt;
&lt;td&gt;source:jar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maven-javadoc-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;生成JavaDoc&lt;/td&gt;
&lt;td&gt;javadoc:javadoc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spring-boot-maven-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SpringBoot打包&lt;/td&gt;
&lt;td&gt;spring-boot:run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;Maven 的生命周期&lt;/h1&gt;
&lt;p&gt;Maven 有三个内置的生命周期：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;default （核心生命周期）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;validate -&amp;gt; compile -&amp;gt; test -&amp;gt; package -&amp;gt; verify -&amp;gt; install -&amp;gt; deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;validate&lt;/td&gt;
&lt;td&gt;验证项目是否正确&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compile&lt;/td&gt;
&lt;td&gt;编译源代码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test&lt;/td&gt;
&lt;td&gt;运行单元测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;package&lt;/td&gt;
&lt;td&gt;打包成 jar/war&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;verify&lt;/td&gt;
&lt;td&gt;检查包是否有效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;install&lt;/td&gt;
&lt;td&gt;安装到本地仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deploy&lt;/td&gt;
&lt;td&gt;部署到远程仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;clean (清理)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;pre-clean -&amp;gt; clean -&amp;gt; post-clean
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pre-clean&lt;/td&gt;
&lt;td&gt;执行清理前需要完成的工作（例如清除之前的日志）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;clean&lt;/td&gt;
&lt;td&gt;删除上一次构建生成的所有文件（核心阶段，默认删除 &lt;code&gt;target&lt;/code&gt; 目录）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;post-clean&lt;/td&gt;
&lt;td&gt;执行清理之后的工作（例如清理完成后的通知）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;site (生成站点)&lt;/p&gt;
&lt;p&gt;Ps. 现在前后端分离基本不会用这个吧&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;pre-site -&amp;gt; site -&amp;gt; post-site -&amp;gt; site-deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;常用命令&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 清理
mvn clean

# 编译
mvn compile

# 运行测试
mvn test

# 打包
mvn package

# 安装到本地仓库
mvn install

# 部署到远程仓库
mvn deploy

# 跳过测试
mvn package -DskipTests

# 指定settings文件
mvn clean install -s /path/to/settings.xml

# 查看依赖树
mvn dependency:tree

# 查看项目信息
mvn help:effective-pom
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Hello World</title><link>https://blog.aiyezi.top/posts/hello-world/</link><guid isPermaLink="true">https://blog.aiyezi.top/posts/hello-world/</guid><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Hi there ~&lt;/h2&gt;
</content:encoded></item></channel></rss>