<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>学习笔记 on 秋萤blog</title>
        <link>https://qiuyingtyan.top/categories/xue-xi-bi-ji/</link>
        <description>Recent content in 学习笔记 on 秋萤blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>秋萤</copyright>
        <lastBuildDate>Sun, 24 Nov 2024 13:49:49 +0000</lastBuildDate><atom:link href="https://qiuyingtyan.top/categories/xue-xi-bi-ji/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Maven的入门和使用</title>
        <link>https://qiuyingtyan.top/p/maven/</link>
        <pubDate>Fri, 22 Nov 2024 16:44:00 +0000</pubDate>
        
        <guid>https://qiuyingtyan.top/p/maven/</guid>
        <description>&lt;img src="https://qiuyingtyan.top/upload/123125006_p0_master1200.webp" alt="Featured image of post Maven的入门和使用" /&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%B8%80%E3%80%81%E4%BB%80%E4%B9%88%E6%98%AFmaven%EF%BC%9F&#34;&gt;一、什么是Maven？&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;Maven 是一个流行的&lt;strong&gt;项目管理工具&lt;/strong&gt;和构建工具，可以对 Java 项目进行&lt;strong&gt;构建&lt;/strong&gt;、&lt;strong&gt;依赖管理&lt;/strong&gt;。简单来说，它就像一个“助手”，使得项目的开发和管理变得更加简单和高效。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;其它知识点补充：&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;项目管理工具：&lt;/strong&gt;指的是一种软件，帮助开发者组织、管理和跟踪项目的进展。使用 Maven，可以轻松创建、配置和维护 Java 项目。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;构建&lt;/strong&gt;：是指将源代码转换为可以运行的程序的过程。Maven 可以自动化这个过程，它会根据指定的配置文件（通常是 &lt;code&gt;pom.xml&lt;/code&gt;）来编译代码、打包程序、运行测试等。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;依赖管理&lt;/strong&gt;：是指处理项目中使用的库或其他组件（称为依赖）的过程。很多 Java 项目会依赖于其他库来实现某些功能。Maven 可以自动下载这些依赖，并确保它们的版本兼容，这样开发者就不需要手动管理这些库的版本和下载。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BA%8C%E3%80%81maven%E6%9C%89%E4%BB%80%E4%B9%88%E7%94%A8%EF%BC%9F%E6%88%91%E4%BB%AC%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%AD%A6maven%EF%BC%9F&#34;&gt;二、Maven有什么用？我们为什么要学Maven？&lt;/h1&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E6%9C%89%E4%BB%80%E4%B9%88%E7%94%A8&#34;&gt;Maven 有什么用&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;项目的自动构建，包括代码的编译、测试、打包、安装、部署等操作。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;依赖管理，项目使用到哪些依赖，可以快速完成导入，不需要手动导入jar包。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;%E6%88%91%E4%BB%AC%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%AD%A6-maven%EF%BC%9F&#34;&gt;我们为什么要学 Maven？&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;简单一句话，你不学maven就别想学别的东西(例如springcloud)！&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%B8%89%E3%80%81maven%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84&#34;&gt;三、Maven项目结构&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/Maven%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84.webp&#34; alt=&#34;Maven项目结构.jpg&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;而下面的pom.xml则是Maven的核心配置，也是整个项目的所有依赖、插件、以及各种配置的集合，它也是使用XML格式编写的，一个标准的pom配置长这样：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt;
&amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34;
         xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
         xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;BookManage&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0&amp;amp;lt;/version&amp;amp;gt;

&amp;amp;lt;properties&amp;amp;gt;
    &amp;amp;lt;maven.compiler.source&amp;amp;gt;17&amp;amp;lt;/maven.compiler.source&amp;amp;gt;
    &amp;amp;lt;maven.compiler.target&amp;amp;gt;17&amp;amp;lt;/maven.compiler.target&amp;amp;gt;
    &amp;amp;lt;project.build.sourceEncoding&amp;amp;gt;UTF-8&amp;amp;lt;/project.build.sourceEncoding&amp;amp;gt;
&amp;amp;lt;/properties&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;pom%E9%85%8D%E7%BD%AE%E8%A7%A3%E9%87%8A%EF%BC%9A&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;pom配置解释：&lt;/span&gt;&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;project&lt;/mark&gt;:：根节点。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;modelVersion&lt;/mark&gt;:：定义了当前模型的版本，不用管它。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;groupId、artifactId、version&lt;/mark&gt;:：这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;groupId&lt;/code&gt; 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是&lt;code&gt;org.example&lt;/code&gt;，一个组下面可以有很多个项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;artifactId&lt;/code&gt; 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;version&lt;/code&gt; 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新，我们可以手动指定当前项目的版本号，其他人使用我们的项目作为依赖时，也可以根据版本号进行选择（这里的SNAPSHOT代表快照，一般表示这是一个处于开发中的项目，正式发布项目一般只带版本号）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;properties&lt;/mark&gt;：这里一般都是一些变量和选项的配置，我们这里指定了JDK的源代码和编译版本为17，同时下面的源代码编码格式为UTF-8，无需进行修改。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%9B%9B%E3%80%81maven%E4%BE%9D%E8%B5%96%E5%AF%BC%E5%85%A5&#34;&gt;四、Maven依赖导入&lt;/h1&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependencies&amp;gt;
//里面填写的就是所有的依赖
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;举例说明（以插入Lombok依赖为例）：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&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;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BA%94%E3%80%81maven%E4%BE%9D%E8%B5%96%E4%BD%9C%E7%94%A8%E5%9F%9F&#34;&gt;五、Maven依赖作用域&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;除了三个基本的属性用于定位坐标外，依赖还可以添加以下属性：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;type&lt;/strong&gt;：依赖的类型，对于项目坐标定义的packaging。大部分情况下，该元素不必声明，其默认值为jar&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;scope&lt;/strong&gt;：依赖的范围&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;optional&lt;/strong&gt;：标记依赖是否可选&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;exclusions&lt;/strong&gt;：用来排除传递性依赖（一个项目有可能依赖于其他项目，就像我们的项目，如果别人要用我们的项目作为依赖，那么就需要一起下载我们项目的依赖，如Lombok）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-type&#34;&gt;&lt;code&gt;1. type&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的类型，对应项目的打包类型（&lt;code&gt;packaging&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;jar&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的类型不是 &lt;code&gt;jar&lt;/code&gt; 时，例如 &lt;code&gt;war&lt;/code&gt;（Web 应用）、&lt;code&gt;pom&lt;/code&gt;（父项目定义）、&lt;code&gt;zip&lt;/code&gt; 等，需要显式声明。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;example-artifact&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-scope%EF%BC%88%E9%87%8D%E7%82%B9%EF%BC%89&#34;&gt;&lt;code&gt;2. scope（重点）&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的作用范围。主要范围包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;（默认值）：编译、测试和运行时都需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;provided&lt;/code&gt;：编译和测试时需要，但运行时由容器（如 Tomcat）提供。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;runtime&lt;/code&gt;：运行和测试时需要，编译时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;test&lt;/code&gt;：仅测试时需要，编译和运行时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;system&lt;/code&gt;：类似于 &lt;code&gt;provided&lt;/code&gt;，但需要本地提供依赖路径（几乎不用）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;import&lt;/code&gt;：用于引入 BOM（Bill of Materials）依赖管理。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-optional&#34;&gt;3. &lt;code&gt;optional&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：标记依赖是否为可选依赖，避免被传递到依赖的消费者（下游项目）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖是可选功能模块，不想影响下游项目时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;optional-lib&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-exclusions&#34;&gt;4. &lt;code&gt;exclusions&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于排除传递性依赖，防止不必要的依赖被引入。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的项目中包含的某些传递性依赖与你的项目冲突时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&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-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.5.0&amp;lt;/version&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-tomcat&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%85%AD%E3%80%81maven%E5%AE%89%E8%A3%85%E3%80%81%E5%8F%AF%E9%80%89%E5%92%8C%E6%8E%92%E9%99%A4&#34;&gt;&lt;strong&gt;六、Maven安装、可选和排除&lt;/strong&gt;&lt;/h1&gt;&lt;h3 style=&#34;&#34; id=&#34;1%E3%80%81maven-%E5%AE%89%E8%A3%85&#34;&gt;1、Maven 安装&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;问题导入：如何在其他项目中引入我们自己编写的Maven项目作为依赖使用呢？&lt;/span&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;先创建一个用于测试的简单项目：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;?xml version=&amp;ldquo;1.0&amp;rdquo; encoding=&amp;ldquo;UTF-8&amp;rdquo;?&amp;gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;TestMaven&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0-SNAPSHOT&amp;amp;lt;/version&amp;amp;gt;

...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public class TestUtils {
public static void test() {
System.out.println(&amp;ldquo;家人们谁懂啊，蒸虾头，怎么会有人想吃我家鸽鸽下的蛋&amp;rdquo;);
}
}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;接着我们点击右上角的Maven选项，然后执行&lt;code&gt;install&lt;/code&gt;或直接在命令行中输入&lt;code&gt;mvn install&lt;/code&gt;来安装我们自己的项目到本地Maven仓库中。&lt;/p&gt;&lt;p style=&#34;line-height: 1.6&#34;&gt;接着我们就可以在需要使用此项目作为依赖的其他项目中使用它了，只需要填写和这边一样的坐标：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;com.test&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;TestMaven&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;接着我们就可以在项目中直接使用了：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public static void main(String[] args) {
TestUtils.test();
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;2%E3%80%81maven-%E4%B8%AD%E7%9A%84%E5%8F%AF%E9%80%89%E4%BE%9D%E8%B5%96%EF%BC%88optional%EF%BC%89&#34;&gt;2、Maven 中的可选依赖（Optional）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Maven 的可选依赖属性 &lt;code&gt;optional&lt;/code&gt; 用于标记某个依赖是否是&lt;strong&gt;可选的&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认行为&lt;/strong&gt;：Maven 会传递所有依赖的依赖（传递性依赖），即如果项目 A 依赖项目 B，而项目 B 又依赖项目 C，则项目 A 会默认获取 B 和 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;使用 &lt;code&gt;optional&lt;/code&gt; 可以避免这种传递性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;场景&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;当某个依赖是额外的功能模块，而下游项目可能不需要它时。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;避免引入无用的依赖，减少构建时间和冲突风险。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，项目 B 依赖项目 C：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;项目 B 中声明 C 为可选依赖：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;结果：项目 A 不会自动获取 C，除非手动添加。&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;3%E3%80%81maven-%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%8E%92%E9%99%A4%EF%BC%88exclusions%EF%BC%89&#34;&gt;3、Maven 中的依赖排除（Exclusions）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;排除传递性依赖中不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;为什么需要？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;防止依赖冲突（例如不同版本的库）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;删除多余的依赖以优化项目构建。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，而项目 B 又依赖项目 C，但项目 A 不需要 C。&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;exclusions&amp;gt;
&amp;lt;exclusion&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;传递性依赖的层级示例&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;项目 A -&amp;gt; 项目 B -&amp;gt; 项目 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;如果不需要项目 C，可通过 &lt;code&gt;exclusions&lt;/code&gt; 将其排除，最终 A 只包含 B。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;常见问题解决&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;依赖冲突&lt;/strong&gt;：当传递性依赖中某个库的多个版本引入冲突时，排除旧版本并手动引入所需版本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;避免不必要的依赖&lt;/strong&gt;：减少构建体积，避免不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E7%9A%84%E7%BB%A7%E6%89%BF&#34;&gt;&lt;strong&gt;Maven的继承&lt;/strong&gt;&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;Maven 的继承机制允许项目的 POM 文件继承另一个 POM 文件中的配置，从而避免重复定义相同的配置。&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-%E7%BB%A7%E6%89%BF%E7%9A%84%E7%89%B9%E7%82%B9&#34;&gt;1. 继承的特点&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;层级结构&lt;/strong&gt;：Maven 的继承是树状结构，一个子项目只能继承一个父项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;统一管理&lt;/strong&gt;：父 POM 通常定义通用的依赖、插件、构建配置等，子 POM 自动继承。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;减少重复&lt;/strong&gt;：多个子项目可以共享父 POM 中的配置，提高复用性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-%E7%88%B6-pom-%E5%AE%9A%E4%B9%89&#34;&gt;2. 父 POM 定义&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;父 POM 中定义通用配置，例如：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;x&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-%E5%AD%90%E9%A1%B9%E7%9B%AE%E7%BB%A7%E6%89%BF&#34;&gt;3. 子项目继承&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;子项目通过 &lt;code&gt;&amp;lt;parent&amp;gt;&lt;/code&gt; 标签指定父 POM：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;x&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;子项目继承父 POM 的依赖管理和插件配置。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;可在子项目中覆盖或补充父 POM 的配置。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;多模块机制用于将一个大项目拆分为多个模块，每个模块都是一个独立的 Maven 项目，但可以共享配置和依赖。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E7%9A%84%E5%A4%9A%E6%A8%A1%E5%9D%97&#34;&gt;Maven的多模块&lt;/h1&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-%E5%A4%9A%E6%A8%A1%E5%9D%97%E7%BB%93%E6%9E%84&#34;&gt;1. 多模块结构&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;多模块项目通常有一个父 POM 和多个子模块，目录结构如下：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-ruby&#34;&gt;project-root/
├── pom.xml          # 父 POM
├── module-a/        # 子模块 A
│   └── pom.xml
├── module-b/        # 子模块 B
│   └── pom.xml&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-%E7%88%B6-pom%EF%BC%88%E6%A0%B9-pom%EF%BC%89&#34;&gt;2. 父 POM（根 POM）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;父 POM 除了继承机制的配置外，还需要声明模块：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;project&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
&amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;multi-module-project&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;!&amp;ndash; 必须是 pom 类型 &amp;ndash;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;modules&amp;amp;gt;
    &amp;amp;lt;module&amp;amp;gt;module-a&amp;amp;lt;/module&amp;amp;gt;
    &amp;amp;lt;module&amp;amp;gt;module-b&amp;amp;lt;/module&amp;amp;gt;
&amp;amp;lt;/modules&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-%E5%AD%90%E6%A8%A1%E5%9D%97%E7%9A%84-pom&#34;&gt;3. 子模块的 POM&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;子模块 POM 需要指定父项目：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;project&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
&amp;lt;parent&amp;gt;
&amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;multi-module-project&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/parent&amp;gt;
&amp;lt;artifactId&amp;gt;module-a&amp;lt;/artifactId&amp;gt;
&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-%E6%9E%84%E5%BB%BA%E5%92%8C%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86&#34;&gt;4. 构建和依赖管理&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;构建&lt;/strong&gt;：在根目录运行 &lt;code&gt;mvn install&lt;/code&gt;，会依次构建所有模块。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;依赖管理&lt;/strong&gt;：模块之间可以互相依赖：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;module-a&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;5.-%E4%BC%98%E5%8A%BF&#34;&gt;5. 优势&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;模块化&lt;/strong&gt;：每个模块负责单一功能，便于开发和维护。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;共享配置&lt;/strong&gt;：通过父 POM 统一管理版本和插件。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;并行构建&lt;/strong&gt;：Maven 可以并行构建多个模块，加快构建速度。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E6%B5%8B%E8%AF%95%E5%92%8C%E6%89%93%E5%8C%85&#34;&gt;Maven测试和打包&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;在 IDEA 中，Maven 项目有多个生命周期，每个生命周期对应一个插件执行任务。常见的命令如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;clean&lt;/code&gt;：清理 &lt;code&gt;target&lt;/code&gt; 文件夹，解决缓存问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;validate&lt;/code&gt;：验证项目的可用性。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;：编译项目为 &lt;code&gt;.class&lt;/code&gt; 文件。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;install&lt;/code&gt;：将项目安装到本地仓库，供其他项目作为依赖使用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;verify&lt;/code&gt;：依次执行 &lt;code&gt;validate&lt;/code&gt;、&lt;code&gt;compile&lt;/code&gt;、&lt;code&gt;package&lt;/code&gt; 等生命周期阶段。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;每个命令执行完后，IDE 会显示 &lt;code&gt;BUILD SUCCESS&lt;/code&gt;，如果出现错误则会显示详细信息。&lt;/p&gt;&lt;h4 style=&#34;&#34; id=&#34;1.-%E6%B5%8B%E8%AF%95%E5%91%BD%E4%BB%A4&#34;&gt;1. 测试命令&lt;/h4&gt;&lt;p style=&#34;&#34;&gt;通过 &lt;code&gt;test&lt;/code&gt; 命令，Maven 会自动运行 &lt;code&gt;test&lt;/code&gt; 目录下的所有测试案例。测试类的名称需要以 &lt;code&gt;Test&lt;/code&gt; 结尾（例如 &lt;code&gt;MainTest&lt;/code&gt;），测试方法必须标注 &lt;code&gt;@Test&lt;/code&gt; 注解。示例如下：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public class MainTest {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@Test
public void test() {
    System.out.println(&amp;quot;我测你码&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&#34;&#34; id=&#34;2.-%E6%89%93%E5%8C%85%E5%91%BD%E4%BB%A4&#34;&gt;2. 打包命令&lt;/h4&gt;&lt;p style=&#34;&#34;&gt;使用 &lt;code&gt;package&lt;/code&gt; 命令可以将项目打包成 JAR 文件，生成的 JAR 文件可以作为其他项目的依赖或可执行文件。执行 &lt;code&gt;package&lt;/code&gt; 时，会先自动执行测试命令，确保项目没有问题。如果希望跳过测试，可以使用以下命令：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;mvn package -Dmaven.test.skip=true&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&#34;&#34; id=&#34;3.-%E6%89%93%E5%8C%85%E5%B8%A6%E4%BE%9D%E8%B5%96%E7%9A%84-jar-%E6%96%87%E4%BB%B6&#34;&gt;3. 打包带依赖的 JAR 文件&lt;/h4&gt;&lt;p style=&#34;&#34;&gt;通常，打包后的 JAR 文件仅包含项目自己的类，而缺少所需的外部依赖。如果要将项目及其依赖一起打包，可以使用 &lt;code&gt;maven-assembly-plugin&lt;/code&gt; 插件。插件配置如下：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;plugin&amp;gt;
&amp;lt;artifactId&amp;gt;maven-assembly-plugin&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt;
&amp;lt;configuration&amp;gt;
&amp;lt;descriptorRefs&amp;gt;
&amp;lt;descriptorRef&amp;gt;jar-with-dependencies&amp;lt;/descriptorRef&amp;gt;
&amp;lt;/descriptorRefs&amp;gt;
&amp;lt;archive&amp;gt;
&amp;lt;manifest&amp;gt;
&amp;lt;addClasspath&amp;gt;true&amp;lt;/addClasspath&amp;gt;
&amp;lt;mainClass&amp;gt;com.test.Main&amp;lt;/mainClass&amp;gt;
&amp;lt;/manifest&amp;gt;
&amp;lt;/archive&amp;gt;
&amp;lt;/configuration&amp;gt;
&amp;lt;executions&amp;gt;
&amp;lt;execution&amp;gt;
&amp;lt;id&amp;gt;make-assembly&amp;lt;/id&amp;gt;
&amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
&amp;lt;goals&amp;gt;
&amp;lt;goal&amp;gt;single&amp;lt;/goal&amp;gt;
&amp;lt;/goals&amp;gt;
&amp;lt;/execution&amp;gt;
&amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;配置好后，重新执行 &lt;code&gt;package&lt;/code&gt; 命令，最终会生成两个 JAR 文件：一个是普通的 JAR 文件，另一个是包含所有依赖的 JAR 文件。我们只需要执行以下命令即可运行：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;java -jar your-project-jar-with-dependencies.jar&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;BookManage&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0&amp;amp;lt;/version&amp;amp;gt;

&amp;amp;lt;properties&amp;amp;gt;
    &amp;amp;lt;maven.compiler.source&amp;amp;gt;17&amp;amp;lt;/maven.compiler.source&amp;amp;gt;
    &amp;amp;lt;maven.compiler.target&amp;amp;gt;17&amp;amp;lt;/maven.compiler.target&amp;amp;gt;
    &amp;amp;lt;project.build.sourceEncoding&amp;amp;gt;UTF-8&amp;amp;lt;/project.build.sourceEncoding&amp;amp;gt;
&amp;amp;lt;/properties&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;pom%E9%85%8D%E7%BD%AE%E8%A7%A3%E9%87%8A%EF%BC%9A&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;pom配置解释：&lt;/span&gt;&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;project&lt;/mark&gt;:：根节点。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;modelVersion&lt;/mark&gt;:：定义了当前模型的版本，不用管它。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;groupId、artifactId、version&lt;/mark&gt;:：这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;groupId&lt;/code&gt; 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是&lt;code&gt;org.example&lt;/code&gt;，一个组下面可以有很多个项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;artifactId&lt;/code&gt; 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;version&lt;/code&gt; 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新，我们可以手动指定当前项目的版本号，其他人使用我们的项目作为依赖时，也可以根据版本号进行选择（这里的SNAPSHOT代表快照，一般表示这是一个处于开发中的项目，正式发布项目一般只带版本号）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;properties&lt;/mark&gt;：这里一般都是一些变量和选项的配置，我们这里指定了JDK的源代码和编译版本为17，同时下面的源代码编码格式为UTF-8，无需进行修改。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%9B%9B%E3%80%81maven%E4%BE%9D%E8%B5%96%E5%AF%BC%E5%85%A5&#34;&gt;四、Maven依赖导入&lt;/h1&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependencies&amp;gt;
//里面填写的就是所有的依赖
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;举例说明（以插入Lombok依赖为例）：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&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;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BA%94%E3%80%81maven%E4%BE%9D%E8%B5%96%E4%BD%9C%E7%94%A8%E5%9F%9F&#34;&gt;五、Maven依赖作用域&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;除了三个基本的属性用于定位坐标外，依赖还可以添加以下属性：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;type&lt;/strong&gt;：依赖的类型，对于项目坐标定义的packaging。大部分情况下，该元素不必声明，其默认值为jar&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;scope&lt;/strong&gt;：依赖的范围&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;optional&lt;/strong&gt;：标记依赖是否可选&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;exclusions&lt;/strong&gt;：用来排除传递性依赖（一个项目有可能依赖于其他项目，就像我们的项目，如果别人要用我们的项目作为依赖，那么就需要一起下载我们项目的依赖，如Lombok）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-type&#34;&gt;&lt;code&gt;1. type&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的类型，对应项目的打包类型（&lt;code&gt;packaging&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;jar&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的类型不是 &lt;code&gt;jar&lt;/code&gt; 时，例如 &lt;code&gt;war&lt;/code&gt;（Web 应用）、&lt;code&gt;pom&lt;/code&gt;（父项目定义）、&lt;code&gt;zip&lt;/code&gt; 等，需要显式声明。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;example-artifact&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-scope%EF%BC%88%E9%87%8D%E7%82%B9%EF%BC%89&#34;&gt;&lt;code&gt;2. scope（重点）&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的作用范围。主要范围包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;（默认值）：编译、测试和运行时都需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;provided&lt;/code&gt;：编译和测试时需要，但运行时由容器（如 Tomcat）提供。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;runtime&lt;/code&gt;：运行和测试时需要，编译时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;test&lt;/code&gt;：仅测试时需要，编译和运行时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;system&lt;/code&gt;：类似于 &lt;code&gt;provided&lt;/code&gt;，但需要本地提供依赖路径（几乎不用）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;import&lt;/code&gt;：用于引入 BOM（Bill of Materials）依赖管理。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-optional&#34;&gt;3. &lt;code&gt;optional&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：标记依赖是否为可选依赖，避免被传递到依赖的消费者（下游项目）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖是可选功能模块，不想影响下游项目时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;optional-lib&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-exclusions&#34;&gt;4. &lt;code&gt;exclusions&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于排除传递性依赖，防止不必要的依赖被引入。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的项目中包含的某些传递性依赖与你的项目冲突时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&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-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.5.0&amp;lt;/version&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-tomcat&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%85%AD%E3%80%81maven%E5%AE%89%E8%A3%85%E3%80%81%E5%8F%AF%E9%80%89%E5%92%8C%E6%8E%92%E9%99%A4&#34;&gt;&lt;strong&gt;六、Maven安装、可选和排除&lt;/strong&gt;&lt;/h1&gt;&lt;h3 style=&#34;&#34; id=&#34;1%E3%80%81maven-%E5%AE%89%E8%A3%85&#34;&gt;1、Maven 安装&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;问题导入：如何在其他项目中引入我们自己编写的Maven项目作为依赖使用呢？&lt;/span&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;先创建一个用于测试的简单项目：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;?xml version=&amp;ldquo;1.0&amp;rdquo; encoding=&amp;ldquo;UTF-8&amp;rdquo;?&amp;gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;TestMaven&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0-SNAPSHOT&amp;amp;lt;/version&amp;amp;gt;

...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public class TestUtils {
public static void test() {
System.out.println(&amp;ldquo;家人们谁懂啊，蒸虾头，怎么会有人想吃我家鸽鸽下的蛋&amp;rdquo;);
}
}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;接着我们点击右上角的Maven选项，然后执行&lt;code&gt;install&lt;/code&gt;或直接在命令行中输入&lt;code&gt;mvn install&lt;/code&gt;来安装我们自己的项目到本地Maven仓库中。&lt;/p&gt;&lt;p style=&#34;line-height: 1.6&#34;&gt;接着我们就可以在需要使用此项目作为依赖的其他项目中使用它了，只需要填写和这边一样的坐标：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;com.test&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;TestMaven&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;接着我们就可以在项目中直接使用了：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public static void main(String[] args) {
TestUtils.test();
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;2%E3%80%81maven-%E4%B8%AD%E7%9A%84%E5%8F%AF%E9%80%89%E4%BE%9D%E8%B5%96%EF%BC%88optional%EF%BC%89&#34;&gt;2、Maven 中的可选依赖（Optional）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Maven 的可选依赖属性 &lt;code&gt;optional&lt;/code&gt; 用于标记某个依赖是否是&lt;strong&gt;可选的&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认行为&lt;/strong&gt;：Maven 会传递所有依赖的依赖（传递性依赖），即如果项目 A 依赖项目 B，而项目 B 又依赖项目 C，则项目 A 会默认获取 B 和 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;使用 &lt;code&gt;optional&lt;/code&gt; 可以避免这种传递性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;场景&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;当某个依赖是额外的功能模块，而下游项目可能不需要它时。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;避免引入无用的依赖，减少构建时间和冲突风险。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，项目 B 依赖项目 C：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;项目 B 中声明 C 为可选依赖：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;结果：项目 A 不会自动获取 C，除非手动添加。&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;3%E3%80%81maven-%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%8E%92%E9%99%A4%EF%BC%88exclusions%EF%BC%89&#34;&gt;3、Maven 中的依赖排除（Exclusions）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;排除传递性依赖中不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;为什么需要？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;防止依赖冲突（例如不同版本的库）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;删除多余的依赖以优化项目构建。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，而项目 B 又依赖项目 C，但项目 A 不需要 C。&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;exclusions&amp;gt;
&amp;lt;exclusion&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;传递性依赖的层级示例&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;项目 A -&amp;gt; 项目 B -&amp;gt; 项目 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;如果不需要项目 C，可通过 &lt;code&gt;exclusions&lt;/code&gt; 将其排除，最终 A 只包含 B。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;常见问题解决&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;依赖冲突&lt;/strong&gt;：当传递性依赖中某个库的多个版本引入冲突时，排除旧版本并手动引入所需版本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;避免不必要的依赖&lt;/strong&gt;：减少构建体积，避免不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E7%9A%84%E7%BB%A7%E6%89%BF&#34;&gt;&lt;strong&gt;Maven的继承&lt;/strong&gt;&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;Maven 的继承机制允许项目的 POM 文件继承另一个 POM 文件中的配置，从而避免重复定义相同的配置。&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-%E7%BB%A7%E6%89%BF%E7%9A%84%E7%89%B9%E7%82%B9&#34;&gt;1. 继承的特点&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;层级结构&lt;/strong&gt;：Maven 的继承是树状结构，一个子项目只能继承一个父项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;统一管理&lt;/strong&gt;：父 POM 通常定义通用的依赖、插件、构建配置等，子 POM 自动继承。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;减少重复&lt;/strong&gt;：多个子项目可以共享父 POM 中的配置，提高复用性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-%E7%88%B6-pom-%E5%AE%9A%E4%B9%89&#34;&gt;2. 父 POM 定义&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;父 POM 中定义通用配置，例如：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;x&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-%E5%AD%90%E9%A1%B9%E7%9B%AE%E7%BB%A7%E6%89%BF&#34;&gt;3. 子项目继承&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;子项目通过 &lt;code&gt;&amp;lt;parent&amp;gt;&lt;/code&gt; 标签指定父 POM：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;x&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;子项目继承父 POM 的依赖管理和插件配置。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;可在子项目中覆盖或补充父 POM 的配置。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;多模块机制用于将一个大项目拆分为多个模块，每个模块都是一个独立的 Maven 项目，但可以共享配置和依赖。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E7%9A%84%E5%A4%9A%E6%A8%A1%E5%9D%97&#34;&gt;Maven的多模块&lt;/h1&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-%E5%A4%9A%E6%A8%A1%E5%9D%97%E7%BB%93%E6%9E%84&#34;&gt;1. 多模块结构&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;多模块项目通常有一个父 POM 和多个子模块，目录结构如下：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-ruby&#34;&gt;project-root/
├── pom.xml          # 父 POM
├── module-a/        # 子模块 A
│   └── pom.xml
├── module-b/        # 子模块 B
│   └── pom.xml&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-%E7%88%B6-pom%EF%BC%88%E6%A0%B9-pom%EF%BC%89&#34;&gt;2. 父 POM（根 POM）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;父 POM 除了继承机制的配置外，还需要声明模块：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;project&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
&amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;multi-module-project&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;!&amp;ndash; 必须是 pom 类型 &amp;ndash;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;modules&amp;amp;gt;
    &amp;amp;lt;module&amp;amp;gt;module-a&amp;amp;lt;/module&amp;amp;gt;
    &amp;amp;lt;module&amp;amp;gt;module-b&amp;amp;lt;/module&amp;amp;gt;
&amp;amp;lt;/modules&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-%E5%AD%90%E6%A8%A1%E5%9D%97%E7%9A%84-pom&#34;&gt;3. 子模块的 POM&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;子模块 POM 需要指定父项目：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;project&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
&amp;lt;parent&amp;gt;
&amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;multi-module-project&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/parent&amp;gt;
&amp;lt;artifactId&amp;gt;module-a&amp;lt;/artifactId&amp;gt;
&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-%E6%9E%84%E5%BB%BA%E5%92%8C%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86&#34;&gt;4. 构建和依赖管理&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;构建&lt;/strong&gt;：在根目录运行 &lt;code&gt;mvn install&lt;/code&gt;，会依次构建所有模块。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;依赖管理&lt;/strong&gt;：模块之间可以互相依赖：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;module-a&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;5.-%E4%BC%98%E5%8A%BF&#34;&gt;5. 优势&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;模块化&lt;/strong&gt;：每个模块负责单一功能，便于开发和维护。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;共享配置&lt;/strong&gt;：通过父 POM 统一管理版本和插件。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;并行构建&lt;/strong&gt;：Maven 可以并行构建多个模块，加快构建速度。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E6%B5%8B%E8%AF%95%E5%92%8C%E6%89%93%E5%8C%85&#34;&gt;Maven测试和打包&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;在 IDEA 中，Maven 项目有多个生命周期，每个生命周期对应一个插件执行任务。常见的命令如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;clean&lt;/code&gt;：清理 &lt;code&gt;target&lt;/code&gt; 文件夹，解决缓存问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;validate&lt;/code&gt;：验证项目的可用性。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;：编译项目为 &lt;code&gt;.class&lt;/code&gt; 文件。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;install&lt;/code&gt;：将项目安装到本地仓库，供其他项目作为依赖使用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;verify&lt;/code&gt;：依次执行 &lt;code&gt;validate&lt;/code&gt;、&lt;code&gt;compile&lt;/code&gt;、&lt;code&gt;package&lt;/code&gt; 等生命周期阶段。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;每个命令执行完后，IDE 会显示 &lt;code&gt;BUILD SUCCESS&lt;/code&gt;，如果出现错误则会显示详细信息。&lt;/p&gt;&lt;h4 style=&#34;&#34; id=&#34;1.-%E6%B5%8B%E8%AF%95%E5%91%BD%E4%BB%A4&#34;&gt;1. 测试命令&lt;/h4&gt;&lt;p style=&#34;&#34;&gt;通过 &lt;code&gt;test&lt;/code&gt; 命令，Maven 会自动运行 &lt;code&gt;test&lt;/code&gt; 目录下的所有测试案例。测试类的名称需要以 &lt;code&gt;Test&lt;/code&gt; 结尾（例如 &lt;code&gt;MainTest&lt;/code&gt;），测试方法必须标注 &lt;code&gt;@Test&lt;/code&gt; 注解。示例如下：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public class MainTest {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@Test
public void test() {
    System.out.println(&amp;quot;我测你码&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&#34;&#34; id=&#34;2.-%E6%89%93%E5%8C%85%E5%91%BD%E4%BB%A4&#34;&gt;2. 打包命令&lt;/h4&gt;&lt;p style=&#34;&#34;&gt;使用 &lt;code&gt;package&lt;/code&gt; 命令可以将项目打包成 JAR 文件，生成的 JAR 文件可以作为其他项目的依赖或可执行文件。执行 &lt;code&gt;package&lt;/code&gt; 时，会先自动执行测试命令，确保项目没有问题。如果希望跳过测试，可以使用以下命令：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;mvn package -Dmaven.test.skip=true&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&#34;&#34; id=&#34;3.-%E6%89%93%E5%8C%85%E5%B8%A6%E4%BE%9D%E8%B5%96%E7%9A%84-jar-%E6%96%87%E4%BB%B6&#34;&gt;3. 打包带依赖的 JAR 文件&lt;/h4&gt;&lt;p style=&#34;&#34;&gt;通常，打包后的 JAR 文件仅包含项目自己的类，而缺少所需的外部依赖。如果要将项目及其依赖一起打包，可以使用 &lt;code&gt;maven-assembly-plugin&lt;/code&gt; 插件。插件配置如下：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;x&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;配置好后，重新执行 &lt;code&gt;package&lt;/code&gt; 命令，最终会生成两个 JAR 文件：一个是普通的 JAR 文件，另一个是包含所有依赖的 JAR 文件。我们只需要执行以下命令即可运行：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;b&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;BookManage&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0&amp;amp;lt;/version&amp;amp;gt;

&amp;amp;lt;properties&amp;amp;gt;
    &amp;amp;lt;maven.compiler.source&amp;amp;gt;17&amp;amp;lt;/maven.compiler.source&amp;amp;gt;
    &amp;amp;lt;maven.compiler.target&amp;amp;gt;17&amp;amp;lt;/maven.compiler.target&amp;amp;gt;
    &amp;amp;lt;project.build.sourceEncoding&amp;amp;gt;UTF-8&amp;amp;lt;/project.build.sourceEncoding&amp;amp;gt;
&amp;amp;lt;/properties&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;pom%E9%85%8D%E7%BD%AE%E8%A7%A3%E9%87%8A%EF%BC%9A&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;pom配置解释：&lt;/span&gt;&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;project&lt;/mark&gt;:：根节点。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;modelVersion&lt;/mark&gt;:：定义了当前模型的版本，不用管它。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;groupId、artifactId、version&lt;/mark&gt;:：这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;groupId&lt;/code&gt; 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是&lt;code&gt;org.example&lt;/code&gt;，一个组下面可以有很多个项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;artifactId&lt;/code&gt; 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;version&lt;/code&gt; 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新，我们可以手动指定当前项目的版本号，其他人使用我们的项目作为依赖时，也可以根据版本号进行选择（这里的SNAPSHOT代表快照，一般表示这是一个处于开发中的项目，正式发布项目一般只带版本号）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;properties&lt;/mark&gt;：这里一般都是一些变量和选项的配置，我们这里指定了JDK的源代码和编译版本为17，同时下面的源代码编码格式为UTF-8，无需进行修改。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%9B%9B%E3%80%81maven%E4%BE%9D%E8%B5%96%E5%AF%BC%E5%85%A5&#34;&gt;四、Maven依赖导入&lt;/h1&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependencies&amp;gt;
//里面填写的就是所有的依赖
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;举例说明（以插入Lombok依赖为例）：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&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;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BA%94%E3%80%81maven%E4%BE%9D%E8%B5%96%E4%BD%9C%E7%94%A8%E5%9F%9F&#34;&gt;五、Maven依赖作用域&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;除了三个基本的属性用于定位坐标外，依赖还可以添加以下属性：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;type&lt;/strong&gt;：依赖的类型，对于项目坐标定义的packaging。大部分情况下，该元素不必声明，其默认值为jar&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;scope&lt;/strong&gt;：依赖的范围&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;optional&lt;/strong&gt;：标记依赖是否可选&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;exclusions&lt;/strong&gt;：用来排除传递性依赖（一个项目有可能依赖于其他项目，就像我们的项目，如果别人要用我们的项目作为依赖，那么就需要一起下载我们项目的依赖，如Lombok）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-type&#34;&gt;&lt;code&gt;1. type&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的类型，对应项目的打包类型（&lt;code&gt;packaging&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;jar&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的类型不是 &lt;code&gt;jar&lt;/code&gt; 时，例如 &lt;code&gt;war&lt;/code&gt;（Web 应用）、&lt;code&gt;pom&lt;/code&gt;（父项目定义）、&lt;code&gt;zip&lt;/code&gt; 等，需要显式声明。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;example-artifact&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-scope%EF%BC%88%E9%87%8D%E7%82%B9%EF%BC%89&#34;&gt;&lt;code&gt;2. scope（重点）&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的作用范围。主要范围包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;（默认值）：编译、测试和运行时都需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;provided&lt;/code&gt;：编译和测试时需要，但运行时由容器（如 Tomcat）提供。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;runtime&lt;/code&gt;：运行和测试时需要，编译时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;test&lt;/code&gt;：仅测试时需要，编译和运行时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;system&lt;/code&gt;：类似于 &lt;code&gt;provided&lt;/code&gt;，但需要本地提供依赖路径（几乎不用）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;import&lt;/code&gt;：用于引入 BOM（Bill of Materials）依赖管理。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-optional&#34;&gt;3. &lt;code&gt;optional&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：标记依赖是否为可选依赖，避免被传递到依赖的消费者（下游项目）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖是可选功能模块，不想影响下游项目时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;optional-lib&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-exclusions&#34;&gt;4. &lt;code&gt;exclusions&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于排除传递性依赖，防止不必要的依赖被引入。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的项目中包含的某些传递性依赖与你的项目冲突时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&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-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.5.0&amp;lt;/version&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-tomcat&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%85%AD%E3%80%81maven%E5%AE%89%E8%A3%85%E3%80%81%E5%8F%AF%E9%80%89%E5%92%8C%E6%8E%92%E9%99%A4&#34;&gt;&lt;strong&gt;六、Maven安装、可选和排除&lt;/strong&gt;&lt;/h1&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E5%AE%89%E8%A3%85&#34;&gt;Maven 安装&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;问题导入：如何在其他项目中引入我们自己编写的Maven项目作为依赖使用呢？&lt;/span&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;先创建一个用于测试的简单项目：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;?xml version=&amp;ldquo;1.0&amp;rdquo; encoding=&amp;ldquo;UTF-8&amp;rdquo;?&amp;gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;TestMaven&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0-SNAPSHOT&amp;amp;lt;/version&amp;amp;gt;

...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public class TestUtils {
public static void test() {
System.out.println(&amp;ldquo;家人们谁懂啊，蒸虾头，怎么会有人想吃我家鸽鸽下的蛋&amp;rdquo;);
}
}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;接着我们点击右上角的Maven选项，然后执行&lt;code&gt;install&lt;/code&gt;或直接在命令行中输入&lt;code&gt;mvn install&lt;/code&gt;来安装我们自己的项目到本地Maven仓库中。&lt;/p&gt;&lt;p style=&#34;line-height: 1.6&#34;&gt;接着我们就可以在需要使用此项目作为依赖的其他项目中使用它了，只需要填写和这边一样的坐标：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;com.test&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;TestMaven&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;接着我们就可以在项目中直接使用了：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public static void main(String[] args) {
TestUtils.test();
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E4%B8%AD%E7%9A%84%E5%8F%AF%E9%80%89%E4%BE%9D%E8%B5%96%EF%BC%88optional%EF%BC%89&#34;&gt;Maven 中的可选依赖（Optional）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Maven 的可选依赖属性 &lt;code&gt;optional&lt;/code&gt; 用于标记某个依赖是否是&lt;strong&gt;可选的&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认行为&lt;/strong&gt;：Maven 会传递所有依赖的依赖（传递性依赖），即如果项目 A 依赖项目 B，而项目 B 又依赖项目 C，则项目 A 会默认获取 B 和 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;使用 &lt;code&gt;optional&lt;/code&gt; 可以避免这种传递性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;场景&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;当某个依赖是额外的功能模块，而下游项目可能不需要它时。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;避免引入无用的依赖，减少构建时间和冲突风险。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，项目 B 依赖项目 C：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;项目 B 中声明 C 为可选依赖：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;结果：项目 A 不会自动获取 C，除非手动添加。&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%8E%92%E9%99%A4%EF%BC%88exclusions%EF%BC%89&#34;&gt;Maven 中的依赖排除（Exclusions）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;排除传递性依赖中不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;为什么需要？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;防止依赖冲突（例如不同版本的库）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;删除多余的依赖以优化项目构建。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，而项目 B 又依赖项目 C，但项目 A 不需要 C。&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;exclusions&amp;gt;
&amp;lt;exclusion&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;传递性依赖的层级示例&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;项目 A -&amp;gt; 项目 B -&amp;gt; 项目 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;如果不需要项目 C，可通过 &lt;code&gt;exclusions&lt;/code&gt; 将其排除，最终 A 只包含 B。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;常见问题解决&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;依赖冲突&lt;/strong&gt;：当传递性依赖中某个库的多个版本引入冲突时，排除旧版本并手动引入所需版本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;避免不必要的依赖&lt;/strong&gt;：减少构建体积，避免不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E7%BB%A7%E6%89%BF%E5%92%8C%E5%A4%9A%E6%A8%A1%E5%9D%97&#34;&gt;&lt;strong&gt;Maven继承和多模块&lt;/strong&gt;&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;BookManage&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0&amp;amp;lt;/version&amp;amp;gt;

&amp;amp;lt;properties&amp;amp;gt;
    &amp;amp;lt;maven.compiler.source&amp;amp;gt;17&amp;amp;lt;/maven.compiler.source&amp;amp;gt;
    &amp;amp;lt;maven.compiler.target&amp;amp;gt;17&amp;amp;lt;/maven.compiler.target&amp;amp;gt;
    &amp;amp;lt;project.build.sourceEncoding&amp;amp;gt;UTF-8&amp;amp;lt;/project.build.sourceEncoding&amp;amp;gt;
&amp;amp;lt;/properties&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;pom%E9%85%8D%E7%BD%AE%E8%A7%A3%E9%87%8A%EF%BC%9A&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;pom配置解释：&lt;/span&gt;&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;project&lt;/mark&gt;:：根节点。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;modelVersion&lt;/mark&gt;:：定义了当前模型的版本，不用管它。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;groupId、artifactId、version&lt;/mark&gt;:：这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;groupId&lt;/code&gt; 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是&lt;code&gt;org.example&lt;/code&gt;，一个组下面可以有很多个项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;artifactId&lt;/code&gt; 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;version&lt;/code&gt; 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新，我们可以手动指定当前项目的版本号，其他人使用我们的项目作为依赖时，也可以根据版本号进行选择（这里的SNAPSHOT代表快照，一般表示这是一个处于开发中的项目，正式发布项目一般只带版本号）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;properties&lt;/mark&gt;：这里一般都是一些变量和选项的配置，我们这里指定了JDK的源代码和编译版本为17，同时下面的源代码编码格式为UTF-8，无需进行修改。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%9B%9B%E3%80%81maven%E4%BE%9D%E8%B5%96%E5%AF%BC%E5%85%A5&#34;&gt;四、Maven依赖导入&lt;/h1&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependencies&amp;gt;
//里面填写的就是所有的依赖
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;举例说明（以插入Lombok依赖为例）：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&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;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BA%94%E3%80%81maven%E4%BE%9D%E8%B5%96%E4%BD%9C%E7%94%A8%E5%9F%9F&#34;&gt;五、Maven依赖作用域&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;除了三个基本的属性用于定位坐标外，依赖还可以添加以下属性：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;type&lt;/strong&gt;：依赖的类型，对于项目坐标定义的packaging。大部分情况下，该元素不必声明，其默认值为jar&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;scope&lt;/strong&gt;：依赖的范围&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;optional&lt;/strong&gt;：标记依赖是否可选&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;exclusions&lt;/strong&gt;：用来排除传递性依赖（一个项目有可能依赖于其他项目，就像我们的项目，如果别人要用我们的项目作为依赖，那么就需要一起下载我们项目的依赖，如Lombok）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-type&#34;&gt;&lt;code&gt;1. type&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的类型，对应项目的打包类型（&lt;code&gt;packaging&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;jar&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的类型不是 &lt;code&gt;jar&lt;/code&gt; 时，例如 &lt;code&gt;war&lt;/code&gt;（Web 应用）、&lt;code&gt;pom&lt;/code&gt;（父项目定义）、&lt;code&gt;zip&lt;/code&gt; 等，需要显式声明。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;example-artifact&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-scope%EF%BC%88%E9%87%8D%E7%82%B9%EF%BC%89&#34;&gt;&lt;code&gt;2. scope（重点）&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的作用范围。主要范围包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;（默认值）：编译、测试和运行时都需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;provided&lt;/code&gt;：编译和测试时需要，但运行时由容器（如 Tomcat）提供。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;runtime&lt;/code&gt;：运行和测试时需要，编译时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;test&lt;/code&gt;：仅测试时需要，编译和运行时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;system&lt;/code&gt;：类似于 &lt;code&gt;provided&lt;/code&gt;，但需要本地提供依赖路径（几乎不用）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;import&lt;/code&gt;：用于引入 BOM（Bill of Materials）依赖管理。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-optional&#34;&gt;3. &lt;code&gt;optional&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：标记依赖是否为可选依赖，避免被传递到依赖的消费者（下游项目）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖是可选功能模块，不想影响下游项目时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;optional-lib&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-exclusions&#34;&gt;4. &lt;code&gt;exclusions&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于排除传递性依赖，防止不必要的依赖被引入。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的项目中包含的某些传递性依赖与你的项目冲突时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&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-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.5.0&amp;lt;/version&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-tomcat&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%85%AD%E3%80%81maven%E5%AE%89%E8%A3%85%E3%80%81%E5%8F%AF%E9%80%89%E5%92%8C%E6%8E%92%E9%99%A4&#34;&gt;&lt;strong&gt;六、Maven安装、可选和排除&lt;/strong&gt;&lt;/h1&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E5%AE%89%E8%A3%85&#34;&gt;Maven 安装&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;问题导入：如何在其他项目中引入我们自己编写的Maven项目作为依赖使用呢？&lt;/span&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;先创建一个用于测试的简单项目：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;?xml version=&amp;ldquo;1.0&amp;rdquo; encoding=&amp;ldquo;UTF-8&amp;rdquo;?&amp;gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;TestMaven&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0-SNAPSHOT&amp;amp;lt;/version&amp;amp;gt;

...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public class TestUtils {
public static void test() {
System.out.println(&amp;ldquo;家人们谁懂啊，蒸虾头，怎么会有人想吃我家鸽鸽下的蛋&amp;rdquo;);
}
}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;接着我们点击右上角的Maven选项，然后执行&lt;code&gt;install&lt;/code&gt;或直接在命令行中输入&lt;code&gt;mvn install&lt;/code&gt;来安装我们自己的项目到本地Maven仓库中。&lt;/p&gt;&lt;p style=&#34;line-height: 1.6&#34;&gt;接着我们就可以在需要使用此项目作为依赖的其他项目中使用它了，只需要填写和这边一样的坐标：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;com.test&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;TestMaven&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;接着我们就可以在项目中直接使用了：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public static void main(String[] args) {
TestUtils.test();
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E4%B8%AD%E7%9A%84%E5%8F%AF%E9%80%89%E4%BE%9D%E8%B5%96%EF%BC%88optional%EF%BC%89&#34;&gt;Maven 中的可选依赖（Optional）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Maven 的可选依赖属性 &lt;code&gt;optional&lt;/code&gt; 用于标记某个依赖是否是&lt;strong&gt;可选的&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认行为&lt;/strong&gt;：Maven 会传递所有依赖的依赖（传递性依赖），即如果项目 A 依赖项目 B，而项目 B 又依赖项目 C，则项目 A 会默认获取 B 和 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;使用 &lt;code&gt;optional&lt;/code&gt; 可以避免这种传递性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;场景&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;当某个依赖是额外的功能模块，而下游项目可能不需要它时。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;避免引入无用的依赖，减少构建时间和冲突风险。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，项目 B 依赖项目 C：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;项目 B 中声明 C 为可选依赖：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;结果：项目 A 不会自动获取 C，除非手动添加。&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%8E%92%E9%99%A4%EF%BC%88exclusions%EF%BC%89&#34;&gt;Maven 中的依赖排除（Exclusions）&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;排除传递性依赖中不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;为什么需要？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;防止依赖冲突（例如不同版本的库）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;删除多余的依赖以优化项目构建。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，而项目 B 又依赖项目 C，但项目 A 不需要 C。&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;exclusions&amp;gt;
&amp;lt;exclusion&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;传递性依赖的层级示例&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;项目 A -&amp;gt; 项目 B -&amp;gt; 项目 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;如果不需要项目 C，可通过 &lt;code&gt;exclusions&lt;/code&gt; 将其排除，最终 A 只包含 B。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;常见问题解决&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;依赖冲突&lt;/strong&gt;：当传递性依赖中某个库的多个版本引入冲突时，排除旧版本并手动引入所需版本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;避免不必要的依赖&lt;/strong&gt;：减少构建体积，避免不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;BookManage&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0&amp;amp;lt;/version&amp;amp;gt;

&amp;amp;lt;properties&amp;amp;gt;
    &amp;amp;lt;maven.compiler.source&amp;amp;gt;17&amp;amp;lt;/maven.compiler.source&amp;amp;gt;
    &amp;amp;lt;maven.compiler.target&amp;amp;gt;17&amp;amp;lt;/maven.compiler.target&amp;amp;gt;
    &amp;amp;lt;project.build.sourceEncoding&amp;amp;gt;UTF-8&amp;amp;lt;/project.build.sourceEncoding&amp;amp;gt;
&amp;amp;lt;/properties&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;pom%E9%85%8D%E7%BD%AE%E8%A7%A3%E9%87%8A%EF%BC%9A&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;pom配置解释：&lt;/span&gt;&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;project&lt;/mark&gt;:：根节点。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;modelVersion&lt;/mark&gt;:：定义了当前模型的版本，不用管它。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;groupId、artifactId、version&lt;/mark&gt;:：这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;groupId&lt;/code&gt; 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是&lt;code&gt;org.example&lt;/code&gt;，一个组下面可以有很多个项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;artifactId&lt;/code&gt; 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;version&lt;/code&gt; 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新，我们可以手动指定当前项目的版本号，其他人使用我们的项目作为依赖时，也可以根据版本号进行选择（这里的SNAPSHOT代表快照，一般表示这是一个处于开发中的项目，正式发布项目一般只带版本号）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;properties&lt;/mark&gt;：这里一般都是一些变量和选项的配置，我们这里指定了JDK的源代码和编译版本为17，同时下面的源代码编码格式为UTF-8，无需进行修改。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%9B%9B%E3%80%81maven%E4%BE%9D%E8%B5%96%E5%AF%BC%E5%85%A5&#34;&gt;四、Maven依赖导入&lt;/h1&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependencies&amp;gt;
//里面填写的就是所有的依赖
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;举例说明（以插入Lombok依赖为例）：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&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;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BA%94%E3%80%81maven%E4%BE%9D%E8%B5%96%E4%BD%9C%E7%94%A8%E5%9F%9F&#34;&gt;五、Maven依赖作用域&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;除了三个基本的属性用于定位坐标外，依赖还可以添加以下属性：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;type&lt;/strong&gt;：依赖的类型，对于项目坐标定义的packaging。大部分情况下，该元素不必声明，其默认值为jar&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;scope&lt;/strong&gt;：依赖的范围&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;optional&lt;/strong&gt;：标记依赖是否可选&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;exclusions&lt;/strong&gt;：用来排除传递性依赖（一个项目有可能依赖于其他项目，就像我们的项目，如果别人要用我们的项目作为依赖，那么就需要一起下载我们项目的依赖，如Lombok）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-type&#34;&gt;&lt;code&gt;1. type&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的类型，对应项目的打包类型（&lt;code&gt;packaging&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;jar&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的类型不是 &lt;code&gt;jar&lt;/code&gt; 时，例如 &lt;code&gt;war&lt;/code&gt;（Web 应用）、&lt;code&gt;pom&lt;/code&gt;（父项目定义）、&lt;code&gt;zip&lt;/code&gt; 等，需要显式声明。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;example-artifact&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-scope%EF%BC%88%E9%87%8D%E7%82%B9%EF%BC%89&#34;&gt;&lt;code&gt;2. scope（重点）&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的作用范围。主要范围包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;（默认值）：编译、测试和运行时都需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;provided&lt;/code&gt;：编译和测试时需要，但运行时由容器（如 Tomcat）提供。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;runtime&lt;/code&gt;：运行和测试时需要，编译时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;test&lt;/code&gt;：仅测试时需要，编译和运行时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;system&lt;/code&gt;：类似于 &lt;code&gt;provided&lt;/code&gt;，但需要本地提供依赖路径（几乎不用）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;import&lt;/code&gt;：用于引入 BOM（Bill of Materials）依赖管理。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-optional&#34;&gt;3. &lt;code&gt;optional&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：标记依赖是否为可选依赖，避免被传递到依赖的消费者（下游项目）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖是可选功能模块，不想影响下游项目时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;optional-lib&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-exclusions&#34;&gt;4. &lt;code&gt;exclusions&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于排除传递性依赖，防止不必要的依赖被引入。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的项目中包含的某些传递性依赖与你的项目冲突时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&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-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.5.0&amp;lt;/version&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-tomcat&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%85%AD%E3%80%81maven%E5%AE%89%E8%A3%85%E3%80%81%E5%8F%AF%E9%80%89%E5%92%8C%E6%8E%92%E9%99%A4&#34;&gt;&lt;strong&gt;六、Maven安装、可选和排除&lt;/strong&gt;&lt;/h1&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E5%AE%89%E8%A3%85&#34;&gt;Maven 安装&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;问题导入：如何在其他项目中引入我们自己编写的Maven项目作为依赖使用呢？&lt;/span&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;先创建一个用于测试的简单项目：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;?xml version=&amp;ldquo;1.0&amp;rdquo; encoding=&amp;ldquo;UTF-8&amp;rdquo;?&amp;gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;com.test&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;TestMaven&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0-SNAPSHOT&amp;amp;lt;/version&amp;amp;gt;

...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public class TestUtils {
public static void test() {
System.out.println(&amp;ldquo;家人们谁懂啊，蒸虾头，怎么会有人想吃我家鸽鸽下的蛋&amp;rdquo;);
}
}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;接着我们点击右上角的Maven选项，然后执行&lt;code&gt;install&lt;/code&gt;或直接在命令行中输入&lt;code&gt;mvn install&lt;/code&gt;来安装我们自己的项目到本地Maven仓库中。&lt;/p&gt;&lt;p style=&#34;line-height: 1.6&#34;&gt;接着我们就可以在需要使用此项目作为依赖的其他项目中使用它了，只需要填写和这边一样的坐标：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;com.test&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;TestMaven&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;接着我们就可以在项目中直接使用了：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public static void main(String[] args) {
TestUtils.test();
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E4%B8%AD%E7%9A%84%E5%8F%AF%E9%80%89%E4%BE%9D%E8%B5%96%EF%BC%88optional%EF%BC%89&#34;&gt;Maven 中的可选依赖（Optional）&lt;/h3&gt;&lt;h4 style=&#34;&#34; id=&#34;%E4%BD%9C%E7%94%A8&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Maven 的可选依赖属性 &lt;code&gt;optional&lt;/code&gt; 用于标记某个依赖是否是&lt;strong&gt;可选的&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认行为&lt;/strong&gt;：Maven 会传递所有依赖的依赖（传递性依赖），即如果项目 A 依赖项目 B，而项目 B 又依赖项目 C，则项目 A 会默认获取 B 和 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;使用 &lt;code&gt;optional&lt;/code&gt; 可以避免这种传递性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4 style=&#34;&#34; id=&#34;%E5%9C%BA%E6%99%AF&#34;&gt;&lt;strong&gt;场景&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;当某个依赖是额外的功能模块，而下游项目可能不需要它时。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;避免引入无用的依赖，减少构建时间和冲突风险。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4 style=&#34;&#34; id=&#34;%E7%A4%BA%E4%BE%8B&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/h4&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，项目 B 依赖项目 C：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;项目 B 中声明 C 为可选依赖：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;结果：项目 A 不会自动获取 C，除非手动添加。&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;maven-%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%8E%92%E9%99%A4%EF%BC%88exclusions%EF%BC%89&#34;&gt;Maven 中的依赖排除（Exclusions）&lt;/h3&gt;&lt;h4 style=&#34;&#34; id=&#34;%E4%BD%9C%E7%94%A8-1&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;排除传递性依赖中不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;为什么需要？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;防止依赖冲突（例如不同版本的库）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;删除多余的依赖以优化项目构建。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4 style=&#34;&#34; id=&#34;%E7%A4%BA%E4%BE%8B-1&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/h4&gt;&lt;p style=&#34;&#34;&gt;项目 A 依赖项目 B，而项目 B 又依赖项目 C，但项目 A 不需要 C。&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-b&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;exclusions&amp;gt;
&amp;lt;exclusion&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;project-c&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&#34;&#34; id=&#34;%E4%BC%A0%E9%80%92%E6%80%A7%E4%BE%9D%E8%B5%96%E7%9A%84%E5%B1%82%E7%BA%A7%E7%A4%BA%E4%BE%8B&#34;&gt;&lt;strong&gt;传递性依赖的层级示例&lt;/strong&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;项目 A -&amp;gt; 项目 B -&amp;gt; 项目 C。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;如果不需要项目 C，可通过 &lt;code&gt;exclusions&lt;/code&gt; 将其排除，最终 A 只包含 B。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4 style=&#34;&#34; id=&#34;%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3&#34;&gt;&lt;strong&gt;常见问题解决&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;依赖冲突&lt;/strong&gt;：当传递性依赖中某个库的多个版本引入冲突时，排除旧版本并手动引入所需版本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;避免不必要的依赖&lt;/strong&gt;：减少构建体积，避免不需要的模块。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;qiuying&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;BookManage&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0&amp;amp;lt;/version&amp;amp;gt;

&amp;amp;lt;properties&amp;amp;gt;
    &amp;amp;lt;maven.compiler.source&amp;amp;gt;17&amp;amp;lt;/maven.compiler.source&amp;amp;gt;
    &amp;amp;lt;maven.compiler.target&amp;amp;gt;17&amp;amp;lt;/maven.compiler.target&amp;amp;gt;
    &amp;amp;lt;project.build.sourceEncoding&amp;amp;gt;UTF-8&amp;amp;lt;/project.build.sourceEncoding&amp;amp;gt;
&amp;amp;lt;/properties&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;pom%E9%85%8D%E7%BD%AE%E8%A7%A3%E9%87%8A%EF%BC%9A&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;pom配置解释：&lt;/span&gt;&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;project&lt;/mark&gt;:：根节点。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;modelVersion&lt;/mark&gt;:：定义了当前模型的版本，不用管它。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;groupId、artifactId、version&lt;/mark&gt;:：这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;groupId&lt;/code&gt; 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是&lt;code&gt;org.example&lt;/code&gt;，一个组下面可以有很多个项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;artifactId&lt;/code&gt; 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;version&lt;/code&gt; 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新，我们可以手动指定当前项目的版本号，其他人使用我们的项目作为依赖时，也可以根据版本号进行选择（这里的SNAPSHOT代表快照，一般表示这是一个处于开发中的项目，正式发布项目一般只带版本号）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;properties&lt;/mark&gt;：这里一般都是一些变量和选项的配置，我们这里指定了JDK的源代码和编译版本为17，同时下面的源代码编码格式为UTF-8，无需进行修改。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%9B%9B%E3%80%81maven%E4%BE%9D%E8%B5%96%E5%AF%BC%E5%85%A5&#34;&gt;四、Maven依赖导入&lt;/h1&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependencies&amp;gt;
//里面填写的就是所有的依赖
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;举例说明（以插入Lombok依赖为例）：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&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;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BA%94%E3%80%81maven%E4%BE%9D%E8%B5%96%E4%BD%9C%E7%94%A8%E5%9F%9F&#34;&gt;五、Maven依赖作用域&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;除了三个基本的属性用于定位坐标外，依赖还可以添加以下属性：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;type&lt;/strong&gt;：依赖的类型，对于项目坐标定义的packaging。大部分情况下，该元素不必声明，其默认值为jar&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;scope&lt;/strong&gt;：依赖的范围&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;optional&lt;/strong&gt;：标记依赖是否可选&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;exclusions&lt;/strong&gt;：用来排除传递性依赖（一个项目有可能依赖于其他项目，就像我们的项目，如果别人要用我们的项目作为依赖，那么就需要一起下载我们项目的依赖，如Lombok）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-type&#34;&gt;&lt;code&gt;1. type&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的类型，对应项目的打包类型（&lt;code&gt;packaging&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;jar&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的类型不是 &lt;code&gt;jar&lt;/code&gt; 时，例如 &lt;code&gt;war&lt;/code&gt;（Web 应用）、&lt;code&gt;pom&lt;/code&gt;（父项目定义）、&lt;code&gt;zip&lt;/code&gt; 等，需要显式声明。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;example-artifact&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-scope&#34;&gt;&lt;code&gt;2. scope&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的作用范围。主要范围包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;（默认值）：编译、测试和运行时都需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;provided&lt;/code&gt;：编译和测试时需要，但运行时由容器（如 Tomcat）提供。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;runtime&lt;/code&gt;：运行和测试时需要，编译时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;test&lt;/code&gt;：仅测试时需要，编译和运行时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;system&lt;/code&gt;：类似于 &lt;code&gt;provided&lt;/code&gt;，但需要本地提供依赖路径（几乎不用）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;import&lt;/code&gt;：用于引入 BOM（Bill of Materials）依赖管理。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-optional&#34;&gt;3. &lt;code&gt;optional&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：标记依赖是否为可选依赖，避免被传递到依赖的消费者（下游项目）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖是可选功能模块，不想影响下游项目时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;optional-lib&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-exclusions&#34;&gt;4. &lt;code&gt;exclusions&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于排除传递性依赖，防止不必要的依赖被引入。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的项目中包含的某些传递性依赖与你的项目冲突时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&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-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.5.0&amp;lt;/version&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-tomcat&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;
&amp;lt;project xmlns=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&#34;&lt;/a&gt;
xmlns:xsi=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://www.w3.org/2001/XMLSchema-instance%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.w3.org/2001/XMLSchema-instance&#34;&lt;/a&gt;
xsi:schemaLocation=&amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/POM/4.0.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://maven.apache.org/xsd/maven-4.0.0.xsd%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&lt;/a&gt;&amp;gt;
&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;groupId&amp;amp;gt;qiuying&amp;amp;lt;/groupId&amp;amp;gt;
&amp;amp;lt;artifactId&amp;amp;gt;BookManage&amp;amp;lt;/artifactId&amp;amp;gt;
&amp;amp;lt;version&amp;amp;gt;1.0&amp;amp;lt;/version&amp;amp;gt;

&amp;amp;lt;properties&amp;amp;gt;
    &amp;amp;lt;maven.compiler.source&amp;amp;gt;17&amp;amp;lt;/maven.compiler.source&amp;amp;gt;
    &amp;amp;lt;maven.compiler.target&amp;amp;gt;17&amp;amp;lt;/maven.compiler.target&amp;amp;gt;
    &amp;amp;lt;project.build.sourceEncoding&amp;amp;gt;UTF-8&amp;amp;lt;/project.build.sourceEncoding&amp;amp;gt;
&amp;amp;lt;/properties&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;pom%E9%85%8D%E7%BD%AE%E8%A7%A3%E9%87%8A%EF%BC%9A&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;pom配置解释：&lt;/span&gt;&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;project&lt;/mark&gt;:：根节点。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;modelVersion&lt;/mark&gt;:：定义了当前模型的版本，不用管它。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;groupId、artifactId、version&lt;/mark&gt;:：这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;groupId&lt;/code&gt; 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是&lt;code&gt;org.example&lt;/code&gt;，一个组下面可以有很多个项目。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;artifactId&lt;/code&gt; 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;version&lt;/code&gt; 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新，我们可以手动指定当前项目的版本号，其他人使用我们的项目作为依赖时，也可以根据版本号进行选择（这里的SNAPSHOT代表快照，一般表示这是一个处于开发中的项目，正式发布项目一般只带版本号）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;mark data-color=&#34;#fef9c3&#34; style=&#34;background-color: #fef9c3; color: inherit&#34;&gt;properties&lt;/mark&gt;：这里一般都是一些变量和选项的配置，我们这里指定了JDK的源代码和编译版本为17，同时下面的源代码编码格式为UTF-8，无需进行修改。&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E4%BE%9D%E8%B5%96%E5%AF%BC%E5%85%A5&#34;&gt;Maven依赖导入&lt;/h1&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependencies&amp;gt;
//里面填写的就是所有的依赖
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;举例说明（以插入Lombok依赖为例）：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&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;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 style=&#34;&#34; id=&#34;maven%E4%BE%9D%E8%B5%96%E4%BD%9C%E7%94%A8%E5%9F%9F&#34;&gt;Maven依赖作用域&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;除了三个基本的属性用于定位坐标外，依赖还可以添加以下属性：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;type&lt;/strong&gt;：依赖的类型，对于项目坐标定义的packaging。大部分情况下，该元素不必声明，其默认值为jar&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;scope&lt;/strong&gt;：依赖的范围&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;optional&lt;/strong&gt;：标记依赖是否可选&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;exclusions&lt;/strong&gt;：用来排除传递性依赖（一个项目有可能依赖于其他项目，就像我们的项目，如果别人要用我们的项目作为依赖，那么就需要一起下载我们项目的依赖，如Lombok）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;1.-type&#34;&gt;&lt;code&gt;1. type&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的类型，对应项目的打包类型（&lt;code&gt;packaging&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;jar&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的类型不是 &lt;code&gt;jar&lt;/code&gt; 时，例如 &lt;code&gt;war&lt;/code&gt;（Web 应用）、&lt;code&gt;pom&lt;/code&gt;（父项目定义）、&lt;code&gt;zip&lt;/code&gt; 等，需要显式声明。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;example-artifact&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&#34;&#34; id=&#34;2.-scope&#34;&gt;&lt;code&gt;2. scope&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：定义依赖的作用范围。主要范围包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;compile&lt;/code&gt;（默认值）：编译、测试和运行时都需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;provided&lt;/code&gt;：编译和测试时需要，但运行时由容器（如 Tomcat）提供。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;runtime&lt;/code&gt;：运行和测试时需要，编译时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;test&lt;/code&gt;：仅测试时需要，编译和运行时不需要。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;system&lt;/code&gt;：类似于 &lt;code&gt;provided&lt;/code&gt;，但需要本地提供依赖路径（几乎不用）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;code&gt;import&lt;/code&gt;：用于引入 BOM（Bill of Materials）依赖管理。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;3.-optional&#34;&gt;3. &lt;code&gt;optional&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：标记依赖是否为可选依赖，避免被传递到依赖的消费者（下游项目）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;默认值&lt;/strong&gt;：&lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖是可选功能模块，不想影响下游项目时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;optional-lib&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;4.-exclusions&#34;&gt;4. &lt;code&gt;exclusions&lt;/code&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于排除传递性依赖，防止不必要的依赖被引入。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：当依赖的项目中包含的某些传递性依赖与你的项目冲突时。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&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-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.5.0&amp;lt;/version&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-tomcat&amp;lt;/artifactId&amp;gt;
&amp;lt;/exclusion&amp;gt;
&amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Lambda表达式</title>
        <link>https://qiuyingtyan.top/p/lambda/</link>
        <pubDate>Fri, 22 Nov 2024 15:59:00 +0000</pubDate>
        
        <guid>https://qiuyingtyan.top/p/lambda/</guid>
        <description>&lt;img src="https://qiuyingtyan.top/upload/97622912_p0_master1200.webp" alt="Featured image of post Lambda表达式" /&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BB%80%E4%B9%88%E6%98%AFlambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9F&#34;&gt;&lt;strong&gt;什么是Lambda表达式？&lt;/strong&gt;&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;Lambda 表达式是 Java 中的一种简洁语法，用于表示&lt;strong&gt;匿名函数&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;它是 Java 8 中引入的功能，旨在提高代码的&lt;strong&gt;简洁性&lt;/strong&gt;和&lt;strong&gt;可读性&lt;/strong&gt;。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;尤其是在处理&lt;strong&gt;函数式编程&lt;/strong&gt;或需要传递行为的场景下，例如集合操作、并行流处理等。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E6%88%91%E4%BB%AC%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%AD%A6%E4%B9%A0%E6%88%96%E4%BD%BF%E7%94%A8lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9F&#34;&gt;我们为什么要学习或使用Lambda表达式？&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;代码更简洁&lt;/strong&gt;：减少了匿名类的样板代码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;更具可读性&lt;/strong&gt;：将行为直接传递给函数。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;结合 Stream API&lt;/strong&gt; 提高数据处理的效率和易读性。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E5%8F%AF%E4%BB%A5%E7%94%A8lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9F&#34;&gt;什么时候可以用Lambda表达式？&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;如果一个接口中有且只有一个待实现的抽象方法，&lt;/strong&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;那么我们可以将匿名内部类简写为Lambda表达式&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;public static void main(String[] args) {
    Study study = () -&amp;gt; System.out.println(&#34;我是逆蝶！&#34;);
  	study.study();
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9&#34;&gt;&lt;strong&gt;注意事项&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Lambda 表达式只能用于&lt;strong&gt;函数式接口&lt;/strong&gt;（接口中有且只有一个抽象方法）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;如果需要使用外部变量，它必须是&lt;strong&gt;隐式 final&lt;/strong&gt;（不能在 Lambda 表达式内外修改其值）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;lambda-%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E8%AF%AD%E6%B3%95&#34;&gt;Lambda 表达式的语法&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;基本语法结构为：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;(参数列表) -&amp;gt; {方法体}&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E6%9E%84%E6%88%90%E9%83%A8%E5%88%86&#34;&gt;&lt;strong&gt;构成部分&lt;/strong&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;参数列表&lt;/strong&gt;：可以有零个、一个或多个参数，参数类型可以省略（由编译器推断）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;箭头符号 (&lt;/strong&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt;：分隔参数列表和方法体。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;方法体&lt;/strong&gt;：包含 Lambda 表达式的逻辑，可用一条或多条语句。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;或者可以这么表示：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;([参数类型 参数名称,]...) ‐&amp;gt; { 代码语句，包括返回值 }&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;和匿名内部类不同，Lambda仅支持接口，不支持抽象类&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;接口内部必须有且仅有一个抽象方法（可以有多个方法，但是必须保证其他方法有默认实现，必须留一个抽象方法出来）&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;%E7%A4%BA%E4%BE%8B&#34;&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/h3&gt;&lt;h4 style=&#34;&#34; id=&#34;1.-%E6%97%A0%E5%8F%82%E6%95%B0%E7%9A%84-lambda-%E8%A1%A8%E8%BE%BE%E5%BC%8F&#34;&gt;1. 无参数的 Lambda 表达式&lt;/h4&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;() -&amp;gt; System.out.println(&#34;Hello Lambda!&#34;);&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&#34;&#34; id=&#34;2.-%E6%9C%89%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%E7%9A%84-lambda-%E8%A1%A8%E8%BE%BE%E5%BC%8F&#34;&gt;2. 有一个参数的 Lambda 表达式&lt;/h4&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;x -&amp;gt; System.out.println(x);&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&#34;&#34; id=&#34;3.-%E6%9C%89%E5%A4%9A%E4%B8%AA%E5%8F%82%E6%95%B0%E7%9A%84-lambda-%E8%A1%A8%E8%BE%BE%E5%BC%8F&#34;&gt;3. 有多个参数的 Lambda 表达式&lt;/h4&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;(a, b) -&amp;gt; a + b&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&#34;&#34; id=&#34;4.-%E6%9C%89%E5%A4%9A%E6%9D%A1%E8%AF%AD%E5%8F%A5%E7%9A%84%E6%96%B9%E6%B3%95%E4%BD%93&#34;&gt;4. 有多条语句的方法体&lt;/h4&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;(x, y) -&amp;gt; { int sum = x + y; return sum; }&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;没看懂？那让我们举一个不那么抽象的例子：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;@FunctionalInterface   //添加了此注解的接口，都支持lambda表达式，符合函数式接口定义
public interface Runnable {
    public abstract void run();   //有且仅有一个抽象方法，此方法返回值为void，且没有参数
}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;因此，Runable的的匿名内部类实现，就可以简写为：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;Runnable runnable = () -&amp;gt; {    };&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;我们也可以写一个玩玩：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;@FunctionalInterface
public interface Test {   //接口类型
    String test(Integer i);    //只有这一个抽象方法，且接受一个int类型参数，返回一个String类型结果
}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;span style=&#34;font-size: 15.98px; color: rgb(93, 93, 93)&#34;&gt;它的Lambda表达式的实现就可以写为：&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Java&#34;&gt;Test test = (Integer i) -&amp;gt; { return i+&#34;&#34;; };  //这里我们就简单将i转换为字符串形式&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>一些回忆——搭建该博客的流程</title>
        <link>https://qiuyingtyan.top/p/memory_blog/</link>
        <pubDate>Wed, 13 Nov 2024 06:41:06 +0000</pubDate>
        
        <guid>https://qiuyingtyan.top/p/memory_blog/</guid>
        <description>&lt;img src="https://qiuyingtyan.top/upload/88278917_p0_master1200.webp" alt="Featured image of post 一些回忆——搭建该博客的流程" /&gt;&lt;h1 style=&#34;&#34; id=&#34;%E6%B3%A8%E5%86%8C%E5%9F%9F%E5%90%8D&#34;&gt;注册域名&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;什么是域名？&lt;/p&gt;&lt;p style=&#34;&#34;&gt;域名可以通俗地理解为互联网上的“门牌号码”或“地址”。每个网站在互联网上都有一个唯一的地址，这个地址就是域名。比如，人们常常访问的“baidu.com”，“taobao.com”等都是域名。它们由一串字符组成，通常包括字母、数字和连接符“-”，并由“.”分隔成几部分。域名的作用是让人们能够更容易地访问和记住网站，而不需要记住复杂的IP地址。同时，域名也具有一定的商业价值，可以作为企业或个人在互联网上的标识和品牌形象。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;域名注册&lt;/p&gt;&lt;p style=&#34;&#34;&gt;博主域名是在阿里云购买的&lt;/p&gt;&lt;p style=&#34;&#34;&gt;官网：阿里云&lt;/p&gt;&lt;blockquote&gt;&lt;p style=&#34;&#34;&gt;&lt;a href=&#34;https://www.aliyun.com/&#34;&gt;阿里云-计算，为了无法计算的价值&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&#34;&#34;&gt;首先注册账户，然后输入你想购买的域名&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E6%B3%A8%E5%86%8C%E5%9F%9F%E5%90%8D.webp&#34; alt=&#34;注册域名.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%9F%9F%E5%90%8D%E5%A4%87%E6%A1%88&#34;&gt;域名备案&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;然后到域名控制台进行&lt;strong&gt;实名认证&lt;/strong&gt;和&lt;strong&gt;解析域名&lt;/strong&gt;就行。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;如果你用的内地服务器那还需要进行域名备案。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;备案的流程就不细说，自己去了解一下就行。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E8%A7%A3%E6%9E%90%E5%9F%9F%E5%90%8D%26%E5%AE%9E%E5%90%8D%E8%AE%A4%E8%AF%81.webp&#34; alt=&#34;解析域名&amp;amp;实名认证.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E8%B4%AD%E4%B9%B0%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8&#34;&gt;购买云服务器&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;准备&lt;/p&gt;&lt;p style=&#34;&#34;&gt;首先需要一台云服务器，要有&lt;strong&gt;公网IP&lt;/strong&gt;的，推荐雨云的：&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;雨云优惠注册地址&lt;/strong&gt;：&lt;/p&gt;&lt;blockquote&gt;&lt;p style=&#34;&#34;&gt;https://www.rainyun.com/114514aa_&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&#34;&#34;&gt;优惠码：114514aa&lt;/p&gt;&lt;p style=&#34;&#34;&gt;使用优惠码注册后绑定微信可获得5折优惠券&lt;/p&gt;&lt;p style=&#34;&#34;&gt;注册完账号后进到雨云控制台，云服务器入口可以在后台的 总览 和 云产品 部分找到：&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E9%9B%A8%E4%BA%91%E6%8E%A7%E5%88%B6%E5%8F%B0.webp&#34; alt=&#34;雨云控制台.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;点击购买云服务器，接着选择服务器区域，国内用户建议选择内地机房，因为延迟低网络稳定，比如宿迁和十堰，其中推荐十堰，因为IP便宜，如果预算充足选择宿迁更好（防御高，BGP线路）。但如果你没有备案域名那建议选择香港或美国的服务器。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;这里我买了HK的服务器（因为懒得备案）&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E8%B4%AD%E4%B9%B0%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8(HK).webp&#34; alt=&#34;购买云服务器(HK).png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;配置选择&lt;strong&gt;2核2G&lt;/strong&gt;一般够用了，如果你网站用户多就选高点的配置，也可以后期升级配置。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B4%AD%E4%B9%B0%E9%85%8D%E7%BD%AE.webp&#34; alt=&#34;云服务器购买配置.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;系统选&lt;strong&gt;Debian11&lt;/strong&gt;就行，预安装APP一个都别选（因为可能会有些不太好的事情发生，别问，问就说是发生了些不友好的经历...）&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E9%A2%84%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F.webp&#34; alt=&#34;预安装系统.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;都选好后就可以点击立即购买了，也可以选择1元试用1天。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;购买后即可在我的云服务器这里看到你买的云服务器，点击管理。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E8%B4%AD%E4%B9%B0%E5%AE%8C%E6%AF%95%EF%BC%8C%E7%82%B9%E5%87%BB%E7%AE%A1%E7%90%86.webp&#34; alt=&#34;购买完毕，点击管理.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%AE%89%E8%A3%851panel%E9%9D%A2%E6%9D%BF&#34;&gt;安装1Panel面板&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;首先需要通过&lt;strong&gt;SSH客户端连接服务器&lt;/strong&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;下载安装并打开ssh客户端软件，ssh客户端软件推荐putty或mobaxterm，还有用win自带的终端或CMD也行&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/SSH%E8%BF%9E%E6%8E%A5.webp&#34; alt=&#34;SSH连接.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;安装1Panel&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh &amp;amp;&amp;amp; bash quick_start.sh&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;安装成功后，控制台会打印面板访问信息，可通过浏览器访问 1Panel：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;http://目标服务器 IP 地址:目标端口/安全入口&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;如果使用的是云服务器，请至安全组开放目标端口。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;ssh 登录 1Panel 服务器后，执行 1pctl user-info 命令可获取安全入口（entrance）&lt;/p&gt;&lt;p style=&#34;&#34;&gt;安装成功后，可使用 1pctl 命令行工具来维护 1Panel&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;span fontsize=&#34;&#34; color=&#34;&#34;&gt;记得&lt;strong&gt;记住账号密码&lt;/strong&gt;噢&lt;/span&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;然后浏览器输入地址登录进去就行惹&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/1Panel%E9%9D%A2%E6%9D%BF.webp&#34; alt=&#34;1Panel面板.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;接着安装应用&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;a href=&#34;https://docs.halo.run/getting-started/install/1panel&#34;&gt;使用 1Panel 部署 | Halo 文档&lt;/a&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;1Panel 简介&lt;a href=&#34;https://docs.halo.run/getting-started/install/1panel#1panel-%E7%AE%80%E4%BB%8B&#34; class=&#34;hash-link&#34;&gt;​&lt;/a&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;a rel=&#34;noopener noreferrer&#34; href=&#34;https://1panel.cn/&#34; target=&#34;_blank&#34;&gt;1Panel&lt;/a&gt; 是一个现代化、开源的 Linux 服务器运维管理面板。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://docs.halo.run/assets/images/1panel-6ffbe25fad8e4cf600af312928911090.png&#34; alt=&#34;1Panel 截图&#34; width=&#34;3840&#34; height=&#34;2975&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;功能&lt;a href=&#34;https://docs.halo.run/getting-started/install/1panel#%E5%8A%9F%E8%83%BD&#34; class=&#34;hash-link&#34;&gt;​&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;快速建站&lt;/strong&gt;：深度集成 WordPress 和 Halo，域名绑定、SSL 证书配置等一键搞定。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;高效管理&lt;/strong&gt;：通过 Web 端轻松管理 Linux 服务器，包括应用管理、主机监控、文件管理、数据库管理、容器管理等。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;安全可靠&lt;/strong&gt;：最小漏洞暴露面，提供防火墙和安全审计等功能。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;一键备份&lt;/strong&gt;：支持一键备份和恢复，备份数据云端存储，永不丢失。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;安装基础软件&lt;a href=&#34;https://docs.halo.run/getting-started/install/1panel#%E5%AE%89%E8%A3%85%E5%9F%BA%E7%A1%80%E8%BD%AF%E4%BB%B6&#34; class=&#34;hash-link&#34;&gt;​&lt;/a&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;在安装 Halo 之前，我们需要先在 1Panel 上安装好所需的软件，包括 OpenResty 和数据库（MySQL、PostgreSQL、MariaDB 都可以）。在接下来的文档中，我们会默认你已经安装好了这两个软件，并不再赘述。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://docs.halo.run/assets/images/openresty-mysql-56dfce15a5de885bca88391d36789080.png&#34; alt=&#34;OpenResty 和 MySQL&#34; width=&#34;2988&#34; height=&#34;1532&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%AE%89%E8%A3%85-halo-%E5%BA%94%E7%94%A8%E2%80%8B&#34;&gt;安装 Halo 应用&lt;a href=&#34;https://docs.halo.run/getting-started/install/1panel#%E5%AE%89%E8%A3%85-halo-%E5%BA%94%E7%94%A8&#34; class=&#34;hash-link&#34;&gt;​&lt;/a&gt;&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;进入应用商店应用列表，选择其中的 Halo 应用进行安装。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://docs.halo.run/assets/images/app-store-halo-acd5c156658ced46a4538cf6ac12c4b0.png&#34; alt=&#34;选择 Halo 应用&#34; width=&#34;2988&#34; height=&#34;1532&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;在应用详情页选择最新的 Halo 版本进行安装。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://docs.halo.run/assets/images/install-halo-6ede4c3cb9e35901443411387b3b84ae.png&#34; alt=&#34;选择 Halo 版本&#34; width=&#34;2988&#34; height=&#34;1532&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;参数说明：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;名称&lt;/strong&gt;：要创建的 Halo 应用的名称。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;版本&lt;/strong&gt;：选择最新的版本即可。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;数据库服务&lt;/strong&gt;：Halo 应用使用的数据库应用，支持下拉选择已安装的数据库应用，1Panel 会自动配置 Halo 使用该数据库。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;数据库名&lt;/strong&gt;：Halo 应用使用的数据库名称，1Panel 会在选中的数据库中自动创建这个数据库。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;数据库用户&lt;/strong&gt;：Halo 应用使用的数据库用户名，1Panel 会在选中的数据库中自动创建这个用户，并添加对应的数据库授权。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;数据库用户密码&lt;/strong&gt;：Halo 应用使用的数据库用户密码，1Panel 会在选中的数据库中自动为上一步创建的用户配置该密码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;外部访问地址&lt;/strong&gt;：Halo 应用的最终访问地址，如果有为 Halo 规划域名，需要配置为域名格式，例如 &lt;code&gt;http://halo.example.com&lt;/code&gt;。否则配置为 &lt;code&gt;http://服务器IP:PORT&lt;/code&gt;，例如 &lt;code&gt;http://192.168.1.1:8090&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;&lt;strong&gt;端口&lt;/strong&gt;：Halo 应用的服务端口。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;开始安装后页面自动跳转到已安装应用列表，等待刚刚安装的 Halo 应用变为已启动状态。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://docs.halo.run/assets/images/halo-status-508f621ea03c74f52806c1ee5aded93f.png&#34; alt=&#34;Halo 运行状态&#34; width=&#34;2988&#34; height=&#34;1532&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%88%9B%E5%BB%BA%E7%BD%91%E7%AB%99%E2%80%8B&#34;&gt;创建网站&lt;a href=&#34;https://docs.halo.run/getting-started/install/1panel#%E5%88%9B%E5%BB%BA%E7%BD%91%E7%AB%99&#34; class=&#34;hash-link&#34;&gt;​&lt;/a&gt;&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;完成 Halo 应用的安装后，此时并不会自动创建一个网站，我们需要手动创建一个网站，然后将 Halo 应用绑定到这个网站上才能使用域名访问。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;点击 1Panel 菜单的 &lt;strong&gt;网站&lt;/strong&gt;，进入网站列表页，点击 &lt;strong&gt;创建网站&lt;/strong&gt; 按钮。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://docs.halo.run/assets/images/new-site-c1a818150254182834e6c74074d6ccb6.png&#34; alt=&#34;创建网站&#34; width=&#34;2988&#34; height=&#34;1532&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;在已装应用中选择我们刚刚新建的 Halo 应用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;正确填写主域名，需要注意的是需要提前解析好域名到服务器 IP。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&#34;&#34;&gt;最后，点击确认按钮，等待网站创建完成即可访问网站进行 &lt;a href=&#34;https://docs.halo.run/getting-started/setup&#34;&gt;初始化&lt;/a&gt;。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://docs.halo.run/assets/images/site-5005ab086c0fb2b1d83319f951e05a5b.png&#34; alt=&#34;网站列表&#34; width=&#34;2988&#34; height=&#34;1532&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;这样我们就部署完成了&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>关于如何在CentOS8上部署若依项目的思考</title>
        <link>https://qiuyingtyan.top/p/ruoyi_bushu/</link>
        <pubDate>Wed, 13 Nov 2024 00:54:13 +0000</pubDate>
        
        <guid>https://qiuyingtyan.top/p/ruoyi_bushu/</guid>
        <description>&lt;img src="https://qiuyingtyan.top/upload/87762152_p0_master1200.webp" alt="Featured image of post 关于如何在CentOS8上部署若依项目的思考" /&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6&#34;&gt;&lt;strong&gt;前提条件&lt;/strong&gt;&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Java环境：确保安装了jdk(博主用的jdk11.0.23)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;数据库：MySQL(博主用的MySQL8.0.26)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Redis：在若依项目中通常用作缓存和消息队列，提升数据访问速度和处理能力(博主用的redis0.5.3)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&#34;&#34;&gt;Nginx：作为反向代理服务器，可以处理请求负载均衡、静态资源服务和 HTTPS 加密，确保高效的流量管理和更好的性能。两者结合使用，可以极大提升应用的响应速度和可靠性(博主用的nginx1.14.1)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E5%85%B7%E4%BD%93%E6%93%8D%E4%BD%9C&#34;&gt;&lt;strong&gt;具体操作&lt;/strong&gt;&lt;/h1&gt;&lt;h2 style=&#34;&#34; id=&#34;java&#34;&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/h2&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%AE%89%E8%A3%85jdk&#34;&gt;安装jdk&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;第一种方法：个人建议去官网上下载jdk的jar包&lt;/p&gt;&lt;p style=&#34;&#34;&gt;访问官方网站：前往 Oracle JDK 下载页面 或 OpenJDK 下载页面。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;选择版本：选择你需要的JDK版本（记得选Linux x64哦）。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;下载包：找到对应的JAR包或安装包（通常是.tar.gz或.zip格式），点击下载。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;解压缩（如需要）：下载完成后，如果是压缩包，可以使用以下命令解压：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;tar -zxvf jdk-&amp;lt;version&amp;gt;.tar.gz&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;把下载好的jar包直接拖进你的home文件夹里&lt;/p&gt;&lt;p style=&#34;&#34;&gt;第二种方法：直接通过命令行下载&lt;/p&gt;&lt;p style=&#34;&#34;&gt;通过包管理器安装&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo dnf install java-11-openjdk-devel&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;确认安装：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;java -version&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h2 style=&#34;&#34; id=&#34;mysql&#34;&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/h2&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%AE%89%E8%A3%85mysql&#34;&gt;安装MySQL&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo dnf install @mysql&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%90%AF%E5%8A%A8mysql%E6%9C%8D%E5%8A%A1&#34;&gt;启动MySQL服务&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo systemctl start mysqld&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E8%AE%BE%E7%BD%AEmysql%E6%9C%8D%E5%8A%A1&#34;&gt;设置MySQL服务&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo systemctl enable mysqld&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E8%BF%90%E8%A1%8C%E5%AE%89%E5%85%A8%E9%85%8D%E7%BD%AE&#34;&gt;运行安全配置&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo mysql_secure_installation&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E7%99%BB%E5%BD%95mysql%E5%B9%B6%E5%88%9B%E5%BB%BA%E8%8B%A5%E4%BE%9D%E9%A1%B9%E7%9B%AE%E9%9C%80%E8%A6%81%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E5%92%8C%E7%94%A8%E6%88%B7&#34;&gt;登录MySQL并创建若依项目需要的数据库和用户&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;mysql -u root -p&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E4%BF%AE%E6%94%B9-root-%E7%9A%84%E5%AF%86%E7%A0%81%E4%B8%BA-123456&#34;&gt;修改 root 的密码为 123456&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED WITH mysql_native_password BY &#39;123456&#39;;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;FLUSH PRIVILEGES;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E4%BF%AE%E6%94%B9-root-%E5%8F%AF%E4%BB%A5%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95&#34;&gt;修改 root 可以远程登录&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;update user set host = &#39;%&#39; where user = &#39;root&#39;;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;FLUSH PRIVILEGES;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%9C%A8mysql%E6%8F%90%E7%A4%BA%E7%AC%A6%E4%B8%8B%E6%89%A7%E8%A1%8C&#34;&gt;在MySQL提示符下执行&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;CREATE DATABASE ruoyi;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;CREATE USER &#39;ruoyiuser&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;your_password&#39;;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;GRANT ALL PRIVILEGES ON ruoyi.* TO &#39;ruoyiuser&#39;@&#39;localhost&#39;;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;FLUSH PRIVILEGES;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-MySQL&#34;&gt;EXIT;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E4%BF%AE%E6%94%B9-mysql-%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6&#34;&gt;修改 mysql 的配置文件&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E4%BF%AE%E6%94%B9%E5%A6%82%E4%B8%8B%E9%85%8D%E7%BD%AE&#34;&gt;修改如下配置&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;bind-address=0.0.0.0&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E9%87%8D%E5%90%AF-mysql-%E6%9C%8D%E5%8A%A1&#34;&gt;重启 mysql 服务&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;service mysql restart&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E4%BD%BF%E7%94%A8%E5%A6%82%E4%B8%8B%E5%91%BD%E4%BB%A4%E6%9F%A5%E7%9C%8B-mysql-%E6%9C%8D%E5%8A%A1%E7%8A%B6%E6%80%81&#34;&gt;使用如下命令查看 MySQL 服务状态&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;service mysql status&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h2 style=&#34;&#34; id=&#34;redis&#34;&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/h2&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%AE%89%E8%A3%85-redis&#34;&gt;安装 Redis&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo dnf install epel-release -y&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo dnf install redis -y&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%90%AF%E5%8A%A8-redis&#34;&gt;启动 Redis&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo systemctl start redis&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E8%AE%BE%E7%BD%AE-redis&#34;&gt;设置 Redis&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo systemctl enable redis&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E9%AA%8C%E8%AF%81-redis-%E6%98%AF%E5%90%A6%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C%EF%BC%9A&#34;&gt;验证 Redis 是否正常运行：&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;redis-cli ping&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;返回 PONG 就是正常运行啦！&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h2 style=&#34;&#34; id=&#34;nginx&#34;&gt;&lt;strong&gt;Nginx&lt;/strong&gt;&lt;/h2&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%AE%89%E8%A3%85-nginx&#34;&gt;安装 Nginx&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo dnf install nginx -y&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%90%AF%E5%8A%A8-nginx&#34;&gt;启动 Nginx&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo systemctl start nginx&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&#34;&#34; id=&#34;%E8%AE%BE%E7%BD%AE-nginx&#34;&gt;设置 Nginx&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo systemctl enable nginx&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;/p&gt;&lt;h1 style=&#34;&#34; id=&#34;%E9%83%A8%E7%BD%B2%E8%8B%A5%E4%BE%9D%E9%A1%B9%E7%9B%AE&#34;&gt;&lt;strong&gt;部署若依项目&lt;/strong&gt;&lt;/h1&gt;&lt;p style=&#34;&#34;&gt;ps：博主自己从阿里的源下载失败了，所以这里就推荐用jar包&lt;/p&gt;&lt;p style=&#34;&#34;&gt;具体步骤：&lt;/p&gt;&lt;p style=&#34;&#34;&gt;进入若依的官网，然后复制箭头所指的地址&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E8%8B%A5%E4%BE%9D%E5%AE%98%E7%BD%91.webp&#34; alt=&#34;若依官网.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;打开你的IDEA，&#34;File&#34;→&#34;Close Project&#34;，关闭现有的项目&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&amp;nbsp;然后新建&#34;Project&#34;→&#34;Get from VCS&#34;→在&#34;URL那行粘贴下载地址&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/IDEA001.webp&#34; alt=&#34;IDEA001.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/IDEA002.webp&#34; alt=&#34;IDEA002.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE%E5%90%8E%EF%BC%8C%E6%9B%B4%E6%94%B9%E4%B8%BB%E5%BA%93%E6%95%B0%E6%8D%AE%E6%BA%90&#34;&gt;创建项目后，更改主库数据源&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E6%9B%B4%E6%94%B9%E4%B8%BB%E6%95%B0%E6%8D%AE%E5%BA%93%E6%BA%90.webp&#34; alt=&#34;更改主数据库源.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8&#34;&gt;准备数据库表&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE%E5%BA%9301.webp&#34; alt=&#34;准备数据库01.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE%E5%BA%9302.webp&#34; alt=&#34;准备数据库02.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;先创建一个数据库，这里我们创建一个名为 ruoyi 的数据库。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;将项目所需的表创建。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;依次将两个 sql 文件中的内容拷贝到 navicat 中，在 sql 中添加使用当前数据库的语句：&lt;/p&gt;&lt;p style=&#34;&#34;&gt;然后执行整个 sql。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;两个 sql 文件全部执行之后，会生成这些表：&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE%E5%BA%9303.webp&#34; alt=&#34;准备数据库03.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93&#34;&gt;配置数据库&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;编辑 application-dev.yml 或 application.yml，配置数据库连接：&lt;/p&gt;&lt;pre&gt;&lt;code&gt;spring:
      datasource:
        url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;serverTimezone=UTC
        username: ruoyiuser
        password: your_password&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;先运行一遍确保没有报错，然后打开右侧的&#34;maven&#34;→&#34;ruoyi&#34;→&#34;Lifecycle&#34;→&#34;package&#34;，然后等待打包完成，就可以在左侧的&#34;ruoyi-admin&#34;→&#34;target&#34; 看到&#34;ruoyi-admin.jar&#34;了。&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E6%89%93%E5%8C%85%E8%8B%A5%E4%BE%9D.webp&#34; alt=&#34;打包若依.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;然后右键&#34;ruoyi-admin.jar&#34;→&#34;Open in&#34;→&#34;Explorer&#34;,你就看到若依的jar包啦&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;%E6%96%B0%E5%BB%BA%E9%83%A8%E7%BD%B2%E7%9B%AE%E5%BD%95&#34;&gt;新建部署目录&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;mkdir -p /opt/deploy/ruoyi/{api,web}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;把你的若依jar包放进api里&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;%E5%90%AF%E5%8A%A8%E8%8B%A5%E4%BE%9D%E9%A1%B9%E7%9B%AE&#34;&gt;启动若依项目&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;在 target 目录下运行：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;java -jar ruoyi-admin.jar&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;此时后端已经准备完毕，我们接下来准备前端&lt;/p&gt;&lt;p style=&#34;&#34;&gt;将ruoyi-vue里的ruoyi-ui打开，然后&lt;/p&gt;&lt;p style=&#34;&#34;&gt;1、安装依赖包，运行 RUOYI-VUE/bin/package.bat&lt;/p&gt;&lt;p style=&#34;&#34;&gt;2、打包构建，运行 RUOYI-VUE/bin/build.bat&lt;/p&gt;&lt;p style=&#34;&#34;&gt;（前提：已安装nodejs和yarn）&lt;/p&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF01.webp&#34; alt=&#34;部署前端01.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;p style=&#34;&#34;&gt;然后把这web文件放这里边&lt;/p&gt;&lt;pre&gt;&lt;code&gt;/opt/deploy/ruoyi/web&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;&lt;img src=&#34;https://qiuyingtyan.top/upload/%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF02.webp&#34; alt=&#34;部署前端02.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; style=&#34;display: inline-block&#34;&gt;&lt;/p&gt;&lt;h3 style=&#34;&#34; id=&#34;%E9%85%8D%E7%BD%AEnginx&#34;&gt;配置Nginx&lt;/h3&gt;&lt;p style=&#34;&#34;&gt;创建新的配置文件：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;sudo vi /etc/nginx/conf.d/ruoyi.conf&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;&#34;&gt;添加以下内容：&lt;/p&gt;&lt;pre&gt;&lt;code class=&#34;language-Shell&#34;&gt;server {
        listen 80;
        server_name your_domain_or_ip;
&lt;pre&gt;&lt;code&gt;    location / {
        proxy_pass http://localhost:8080;  # 若依默认端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;然后Esc → ： → wq&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E9%87%8D%E5%90%AF-nginx&amp;quot;&amp;gt;重启 Nginx&amp;lt;/h3&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;sudo systemctl restart nginx&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E6%9C%80%E7%BB%88%E6%95%88%E6%9E%9C&amp;quot;&amp;gt;最终效果&amp;lt;/h3&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;最后，打开浏览器，访问 http://your_domain_or_ip，就可以看到若依的登录界面了。&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E5%89%8D%E7%AB%AF%E6%88%90%E5%8A%9F.webp&amp;quot; alt=&amp;quot;前端成功.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E5%90%8E%E7%AB%AF%E6%88%90%E5%8A%9F.webp&amp;quot; alt=&amp;quot;后端成功.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
  datasource:
    url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&amp;amp;amp;characterEncoding=utf8&amp;amp;amp;serverTimezone=UTC
    username: ruoyiuser
    password: your_password&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;先运行一遍确保没有报错，然后打开右侧的&amp;quot;maven&amp;quot;→&amp;quot;ruoyi&amp;quot;→&amp;quot;Lifecycle&amp;quot;→&amp;quot;package&amp;quot;，然后等待打包完成，就可以在左侧的&amp;quot;ruoyi-admin&amp;quot;→&amp;quot;target&amp;quot; 看到&amp;quot;ruoyi-admin.jar&amp;quot;了。&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E6%89%93%E5%8C%85%E8%8B%A5%E4%BE%9D.webp&amp;quot; alt=&amp;quot;打包若依.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;然后右键&amp;quot;ruoyi-admin.jar&amp;quot;→&amp;quot;Open in&amp;quot;→&amp;quot;Explorer&amp;quot;,你就看到若依的jar包啦&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E6%96%B0%E5%BB%BA%E9%83%A8%E7%BD%B2%E7%9B%AE%E5%BD%95&amp;quot;&amp;gt;新建部署目录&amp;lt;/h3&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;mkdir -p /opt/deploy/ruoyi/{api,web}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;把你的若依jar包放进api里&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E5%90%AF%E5%8A%A8%E8%8B%A5%E4%BE%9D%E9%A1%B9%E7%9B%AE&amp;quot;&amp;gt;启动若依项目&amp;lt;/h3&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;在 target 目录下运行：&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;java -jar ruoyi-admin.jar&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;此时后端已经准备完毕，我们接下来准备前端&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;将ruoyi-vue里的ruoyi-ui打开，然后&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;1、安装依赖包，运行 RUOYI-VUE/bin/package.bat&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;2、打包构建，运行 RUOYI-VUE/bin/build.bat&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;（前提：已安装nodejs和yarn）&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF01.webp&amp;quot; alt=&amp;quot;部署前端01.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;然后把这web文件放这里边&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;/opt/deploy/ruoyi/web&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF02.webp&amp;quot; alt=&amp;quot;部署前端02.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E9%85%8D%E7%BD%AEnginx&amp;quot;&amp;gt;配置Nginx&amp;lt;/h3&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;创建新的配置文件：&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;sudo vi /etc/nginx/conf.d/ruoyi.conf&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;添加以下内容：&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;server {
    listen 80;
    server_name your_domain_or_ip;

    location / {
        proxy_pass http://localhost:8080;  # 若依默认端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;然后Esc → ： → wq&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E9%87%8D%E5%90%AF-nginx&amp;quot;&amp;gt;重启 Nginx&amp;lt;/h3&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;sudo systemctl restart nginx&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E6%9C%80%E7%BB%88%E6%95%88%E6%9E%9C&amp;quot;&amp;gt;最终效果&amp;lt;/h3&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;最后，打开浏览器，访问 http://your_domain_or_ip，就可以看到若依的登录界面了。&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E5%89%8D%E7%AB%AF%E6%88%90%E5%8A%9F.webp&amp;quot; alt=&amp;quot;前端成功.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E5%90%8E%E7%AB%AF%E6%88%90%E5%8A%9F.webp&amp;quot; alt=&amp;quot;后端成功.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
  datasource:
    url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&amp;amp;amp;characterEncoding=utf8&amp;amp;amp;serverTimezone=UTC
    username: ruoyiuser
    password: your_password&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;先运行一遍确保没有报错，然后打开右侧的&amp;quot;maven&amp;quot;→&amp;quot;ruoyi&amp;quot;→&amp;quot;Lifecycle&amp;quot;→&amp;quot;package&amp;quot;，然后等待打包完成，就可以在左侧的&amp;quot;ruoyi-admin&amp;quot;→&amp;quot;target&amp;quot; 看到&amp;quot;ruoyi-admin.jar&amp;quot;了。&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E6%89%93%E5%8C%85%E8%8B%A5%E4%BE%9D.webp&amp;quot; alt=&amp;quot;打包若依.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;然后右键&amp;quot;ruoyi-admin.jar&amp;quot;→&amp;quot;Open in&amp;quot;→&amp;quot;Explorer&amp;quot;,你就看到若依的jar包啦&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E6%96%B0%E5%BB%BA%E9%83%A8%E7%BD%B2%E7%9B%AE%E5%BD%95&amp;quot;&amp;gt;新建部署目录&amp;lt;/h3&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;mkdir -p /opt/deploy/ruoyi/{api,web}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;把你的若依jar包放进api里&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E5%90%AF%E5%8A%A8%E8%8B%A5%E4%BE%9D%E9%A1%B9%E7%9B%AE&amp;quot;&amp;gt;启动若依项目&amp;lt;/h3&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;在 target 目录下运行：&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;java -jar ruoyi-admin.jar&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span fontsize=&amp;quot;&amp;quot; color=&amp;quot;&amp;quot;&amp;gt;此时后端已经准备完毕，我们接下来准备前端&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;将ruoyi-vue里的ruoyi-ui打开，然后&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;1、安装依赖包，运行 RUOYI-VUE/bin/package.bat&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;2、打包构建，运行 RUOYI-VUE/bin/build.bat&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span fontsize=&amp;quot;&amp;quot; color=&amp;quot;&amp;quot;&amp;gt;（前提：已安装nodejs和yarn）&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF01.webp&amp;quot; alt=&amp;quot;部署前端01.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;然后把这web文件放这里边&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;/opt/deploy/ruoyi/web&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF02.webp&amp;quot; alt=&amp;quot;部署前端02.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E9%85%8D%E7%BD%AEnginx&amp;quot;&amp;gt;&amp;lt;span fontsize=&amp;quot;&amp;quot; color=&amp;quot;&amp;quot;&amp;gt;配置Nginx&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span fontsize=&amp;quot;&amp;quot; color=&amp;quot;&amp;quot;&amp;gt;创建新的配置文件：&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;sudo vi /etc/nginx/conf.d/ruoyi.conf&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span fontsize=&amp;quot;&amp;quot; color=&amp;quot;&amp;quot;&amp;gt;添加以下内容：&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;server {
    listen 80;
    server_name your_domain_or_ip;

    location / {
        proxy_pass http://localhost:8080;  # 若依默认端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span fontsize=&amp;quot;&amp;quot; color=&amp;quot;&amp;quot;&amp;gt;然后Esc → ： → wq&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E9%87%8D%E5%90%AF-nginx&amp;quot;&amp;gt;&amp;lt;span fontsize=&amp;quot;&amp;quot; color=&amp;quot;&amp;quot;&amp;gt;重启 Nginx&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-Shell&amp;quot;&amp;gt;sudo systemctl restart nginx&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;h3 style=&amp;quot;&amp;quot; id=&amp;quot;%E6%9C%80%E7%BB%88%E6%95%88%E6%9E%9C&amp;quot;&amp;gt;最终效果&amp;lt;/h3&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;最后，打开浏览器，访问 http://your_domain_or_ip，就可以看到若依的登录界面了。&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E5%89%8D%E7%AB%AF%E6%88%90%E5%8A%9F.webp&amp;quot; alt=&amp;quot;前端成功.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E5%90%8E%E7%AB%AF%E6%88%90%E5%8A%9F.webp&amp;quot; alt=&amp;quot;后端成功.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
  datasource:
    url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&amp;amp;amp;characterEncoding=utf8&amp;amp;amp;serverTimezone=UTC
    username: ruoyiuser
    password: your_password&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;先运行一遍确保没有报错，然后打开右侧的&amp;quot;maven&amp;quot;→&amp;quot;ruoyi&amp;quot;→&amp;quot;Lifecycle&amp;quot;→&amp;quot;package&amp;quot;，然后等待打包完成，就可以在左侧的&amp;quot;ruoyi-admin&amp;quot;→&amp;quot;target&amp;quot; 看到&amp;quot;ruoyi-admin.jar&amp;quot;了。&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E6%89%93%E5%8C%85%E8%8B%A5%E4%BE%9D.webp&amp;quot; alt=&amp;quot;打包若依.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;然后右键&amp;quot;ruoyi-admin.jar&amp;quot;→&amp;quot;Open in&amp;quot;→&amp;quot;Explorer&amp;quot;,你就看到若依的jar包啦&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;新建部署目录&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;mkdir -p /opt/deploy/ruoyi/{api,web}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;把你的若依jar包放进api里&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;启动若依项目：&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;在 target 目录下运行：&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;java -jar ruoyi-admin.jar&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 11ptpx&amp;quot;&amp;gt;此时后端已经准备完毕，我们接下来准备前端&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;将ruoyi-vue里的ruoyi-ui打开，然后&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;1、安装依赖包，运行 RUOYI-VUE/bin/package.bat&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;2、打包构建，运行 RUOYI-VUE/bin/build.bat&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 11ptpx&amp;quot;&amp;gt;（前提：已安装nodejs和yarn）&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF01.webp&amp;quot; alt=&amp;quot;部署前端01.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;然后把这web文件放这里边&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;/opt/deploy/ruoyi/web&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF02.webp&amp;quot; alt=&amp;quot;部署前端02.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 11ptpx&amp;quot;&amp;gt;配置Nginx&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 11ptpx&amp;quot;&amp;gt;创建新的配置文件：&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;sudo vi /etc/nginx/conf.d/ruoyi.conf&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 11ptpx&amp;quot;&amp;gt;添加以下内容：&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;server {
    listen 80;
    server_name your_domain_or_ip;

    location / {
        proxy_pass http://localhost:8080;  # 若依默认端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 11ptpx&amp;quot;&amp;gt;然后Esc → ： → wq&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 11ptpx&amp;quot;&amp;gt;重启 Nginx：&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;sudo systemctl restart nginx&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;最后，打开浏览器，访问 http://your_domain_or_ip，就可以看到若依的登录界面了。&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E5%89%8D%E7%AB%AF%E6%88%90%E5%8A%9F.webp&amp;quot; alt=&amp;quot;前端成功.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/upload/%E5%90%8E%E7%AB%AF%E6%88%90%E5%8A%9F.webp&amp;quot; alt=&amp;quot;后端成功.png&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</description>
        </item>
        
    </channel>
</rss>
