Maven - 统一构建规范:Maven 插件管理最佳实践

文章目录

  • Available Plugins
  • 开源项目中的使用
  • 插件介绍
    • maven-jar-plugin
    • maven-assembly-plugin
    • maven-shade-plugin
      • Shade 插件 - 标签
        • artifactSet
        • relocations
        • filters
      • 完整配置

在这里插入图片描述


Available Plugins

https://maven.apache.org/plugins/index.html

Maven 是一个开源的软件构建工具,它支持多种插件,用于帮助开发人员更方便地管理构建过程中所需的各种资源。以下是一些常用的 Maven 插件:

  1. Maven-clean-plugin:用于清除项目目录中的垃圾文件和临时文件。
  2. Maven-compile-plugin:用于编译项目源代码,生成目标代码。
  3. Maven-dependency-plugin:用于管理项目依赖关系,可以自动下载依赖库,并解决依赖冲突。
  4. Maven-jar-plugin:用于打包项目,生成 JAR 文件。
  5. Maven-javadoc-plugin:用于生成项目 Javadoc 文档。
  6. Maven-install-plugin:用于安装项目依赖库,可以将依赖库安装到本地仓库中。
  7. Maven-deploy-plugin:用于部署项目,可以将项目打包成可执行的包,并上传到远程仓库中。
  8. Maven-site-plugin:用于生成项目网站,可以自动生成 HTML 文档,并上传到远程仓库中。
  9. Maven-scm-plugin:用于管理项目版本,可以与版本控制系统集成,实现代码的版本控制。
  10. Maven-release-plugin:用于发布项目,可以将项目打包成可执行的包,并上传到远程仓库中,同时发布版本更新信息。
    在这里插入图片描述

这些插件可以帮助开发人员更方便地管理构建过程中所需的各种资源,提高软件构建的效率和质量。


开源项目中的使用

我们来看下nacos这个开源项目的plugin是如何使用的。 不得不说还是非常丰富的 。
在这里插入图片描述

   <!-- =========================================================Build plugins================================================ --><!-- == --><build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>versions-maven-plugin</artifactId><version>${versions-maven-plugin.version}</version></plugin><plugin><groupId>com.github.vongosling</groupId><artifactId>dependency-mediator-maven-plugin</artifactId><version>${dependency-mediator-maven-plugin.version}</version></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>clirr-maven-plugin</artifactId><version>${clirr-maven-plugin.version}</version></plugin><plugin><artifactId>maven-enforcer-plugin</artifactId><version>${maven-enforcer-plugin.version}</version><executions><execution><id>enforce-ban-circular-dependencies</id><goals><goal>enforce</goal></goals></execution></executions><configuration><rules><banCircularDependencies/></rules><fail>true</fail></configuration><dependencies><dependency><groupId>org.codehaus.mojo</groupId><artifactId>extra-enforcer-rules</artifactId><version>${extra-enforcer-rules.version}</version></dependency></dependencies></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>${maven-compiler-plugin.version}</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target><compilerVersion>${maven.compiler.source}</compilerVersion><showDeprecation>true</showDeprecation><showWarnings>true</showWarnings></configuration></plugin><plugin><artifactId>maven-javadoc-plugin</artifactId><version>${maven-javadoc-plugin.version}</version><configuration><charset>UTF-8</charset></configuration><executions><execution><id>attach-javadocs</id><goals><goal>jar</goal></goals></execution></executions></plugin><plugin><artifactId>maven-source-plugin</artifactId><version>${maven-source-plugin.version}</version><executions><execution><id>attach-sources</id><goals><goal>jar</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-pmd-plugin</artifactId><version>${maven-pmd-plugin.version}</version><configuration><rulesets><ruleset>rulesets/java/ali-comment.xml</ruleset><ruleset>rulesets/java/ali-concurrent.xml</ruleset><ruleset>rulesets/java/ali-constant.xml</ruleset><ruleset>rulesets/java/ali-exception.xml</ruleset><ruleset>rulesets/java/ali-flowcontrol.xml</ruleset><ruleset>rulesets/java/ali-naming.xml</ruleset><ruleset>rulesets/java/ali-oop.xml</ruleset><ruleset>rulesets/java/ali-orm.xml</ruleset><ruleset>rulesets/java/ali-other.xml</ruleset><ruleset>rulesets/java/ali-set.xml</ruleset></rulesets><printFailingErrors>true</printFailingErrors><excludes><exclude>**/consistency/entity/*.java</exclude><exclude>**/istio/model/mcp/*.java</exclude><exclude>**/istio/model/naming/*.java</exclude><exclude>**/istio/model/*.java</exclude><exclude>**/api/grpc/auto/*.java</exclude><exclude>**/istio/mcp/**</exclude><exclude>**/istio/networking/**</exclude><exclude>**/google/protobuf/**</exclude></excludes></configuration><executions><execution><goals><goal>check</goal></goals></execution></executions><dependencies><dependency><groupId>com.alibaba.p3c</groupId><artifactId>p3c-pmd</artifactId><version>${p3c-pmd.version}</version></dependency></dependencies></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-checkstyle-plugin</artifactId><version>${maven-checkstyle-plugin.version}</version><configuration><configLocation>style/NacosCheckStyle.xml</configLocation><includeTestSourceDirectory>true</includeTestSourceDirectory><encoding>UTF-8</encoding><consoleOutput>true</consoleOutput><failsOnError>true</failsOnError><excludes>**/consistency/entity/**,**/nacos/test/**,**/api/grpc/auto/**,**/istio/**,**/protobuf/**</excludes></configuration><executions><execution><id>validate</id><phase>validate</phase><goals><goal>check</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.rat</groupId><artifactId>apache-rat-plugin</artifactId><version>${apache-rat-plugin.version}</version><configuration><excludes><exclude>.editorconfig</exclude><exclude>.travis.yml</exclude><exclude>CONTRIBUTING.md</exclude><exclude>CODE_OF_CONDUCT.md</exclude><exclude>CHANGELOG.md</exclude><exclude>style/codeStyle.md</exclude><exclude>REPORTING-BUGS.md</exclude><exclude>README.md</exclude><exclude>.github/**/*</exclude><exclude>doc/*</exclude><exclude>derby.log</exclude><exclude>logs/*</exclude><exclude>src/main/resources/static/**</exclude><exclude>**/istio/model/**</exclude><exclude>**/consistency/entity/**</exclude><exclude>**/*.txt</exclude><exclude>**/*.factories</exclude><exclude>/console-ui/**</exclude><exclude>**/gogo.proto</exclude><exclude>**/any.proto</exclude></excludes></configuration><executions><execution><phase>verify</phase><goals><goal>check</goal></goals></execution></executions></plugin><plugin><artifactId>maven-resources-plugin</artifactId><version>${maven-resources-plugin.version}</version><configuration><!-- We are not suppose to setup the customer resources here --><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin><plugin><groupId>org.eluder.coveralls</groupId><artifactId>coveralls-maven-plugin</artifactId><version>${coveralls-maven-plugin.version}</version></plugin><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${jacoco-maven-plugin.version}</version><executions><execution><id>default-prepare-agent</id><goals><goal>prepare-agent</goal></goals><configuration><destFile>${project.build.directory}/jacoco.exec</destFile></configuration></execution><execution><id>default-prepare-agent-integration</id><phase>pre-integration-test</phase><goals><goal>prepare-agent-integration</goal></goals><configuration><destFile>${project.build.directory}/jacoco-it.exec</destFile><propertyName>failsafeArgLine</propertyName></configuration></execution><execution><id>default-report</id><goals><goal>report</goal></goals></execution><execution><id>default-report-integration</id><goals><goal>report-integration</goal></goals></execution></executions></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>${maven-surefire-plugin.version}</version></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>findbugs-maven-plugin</artifactId><version>${findbugs-maven-plugin.version}</version></plugin><plugin><groupId>org.sonarsource.scanner.maven</groupId><artifactId>sonar-maven-plugin</artifactId><version>${sonar-maven-plugin.version}</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>${maven-assembly-plugin.version}</version></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><version>${maven-flatten-version}</version><configuration><updatePomFile>true</updatePomFile><flattenMode>resolveCiFriendliesOnly</flattenMode><pomElements><dependencies>expand</dependencies></pomElements></configuration><executions><execution><id>flatten</id><phase>process-resources</phase><goals><goal>flatten</goal></goals></execution><execution><id>flatten.clean</id><phase>clean</phase><goals><goal>clean</goal></goals></execution></executions></plugin></plugins></build>

插件介绍

maven-jar-plugin

https://maven.apache.org/plugins/maven-jar-plugin/

在这里插入图片描述

maven-jar-plugin 是 Maven 的一个插件,用于创建 JAR 文件。它可以将项目的源代码、依赖项和配置文件打包成一个 JAR 文件,以便在应用程序中使用。该插件使用 Apache Maven 的默认构建系统,因此可以使用 Maven 的所有功能,如依赖项管理、构建脚本等。

使用 maven-jar-plugin 的主要优点是可以轻松地创建 JAR 文件,而不必手动编写 Ant 脚本或使用其他工具。此外,该插件还支持一些高级功能,如资源过滤、代码混淆和 Javadoc 文档生成等。这些功能可以使 JAR 文件更加强大和易于使用。

maven-jar-plugin 通常与 Maven 的其他插件一起使用,如 maven-compiler-plugin 和 maven-resources-plugin,以构建复杂的应用程序。例如,可以使用 maven-jar-plugin 将编译后的源代码打包成 JAR 文件,并使用 maven-resources-plugin 将资源文件打包成 JAR 文件。

这些插件可以一起使用,以构建具有各种功能和依赖项的应用程序。

假设我们要创建一个名为my-project的 JAR 文件,其中包含项目中的源代码、依赖项和一些资源文件。我们可以使用 maven-jar-plugin 来完成这个任务。以下是一个具体的使用案例:

  1. 首先,在 Maven 项目中添加 maven-jar-plugin 插件。在pom.xml文件中的<build>标签内添加以下内容:
<build>  <plugins>  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-jar-plugin</artifactId>  <version>3.2</version>  <executions>  <execution>  <goals>  <goal>jar</goal>  </goals>  </execution>  </executions>  </plugin>  </plugins>  
</build>  
  1. 配置maven-jar-plugin的参数。在<execution>标签内,我们可以添加以下内容:
<execution>  <goals>  <goal>jar</goal>  </goals>  <configuration>  <artifactId>my-project</artifactId>  <version>1.0</version>  <includes>  <include>src/main/java/**</include>  <include>src/main/resources/**</include>  </includes>  </configuration>  
</execution>  

在这个例子中,我们设置了artifactIdmy-projectversion1.0。此外,我们还指定了要包含的源代码和资源文件的路径。

  1. 执行 Maven 构建。在项目根目录下运行以下命令:
mvn clean package  

这将清理项目目录并构建 JAR 文件。

  1. 查看生成的 JAR 文件。在target目录下,你应该会看到生成的my-project-1.0.jar文件。
    通过这个案例,我们已经成功地使用 maven-jar-plugin 创建了一个 JAR 文件,其中包含项目的源代码和资源文件。这个例子展示了如何简单地使用 maven-jar-plugin 来打包 Maven 项目。在实际项目中,你可能还需要配置其他参数以满足不同的需求。

看个 nacos的类似的配置
在这里插入图片描述
这段代码是在pom.xml中的<build>标签内添加了一个maven-jar-plugin插件的配置。以下是各个部分的解释:

  1. <plugin>:开始定义一个插件。
  2. <artifactId>maven-jar-plugin</artifactId>:指定插件的 artifactId 为 maven-jar-plugin`。
  3. <configuration>:开始定义插件的配置。
  4. <archive>:开始定义归档(archive)配置。
  5. <manifest>:开始定义 manifest 配置。
  6. <addDefaultImplementationEntries>true</addDefaultImplementationEntries>:设置为 true以在 manifest 中添加默认实现入口。这将告诉 Java 运行时使用指定的类(通常是main` 类)作为应用程序的入口点。
  7. <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>:设置为 true以在 manifest 中添加默认规范入口。这将告诉 Java 运行时使用指定的类(通常是main` 类)作为应用程序的入口点,同时还会添加一些额外的规范信息。
  8. :结束 manifest 配置。
  9. :结束归档(archive)配置。
  10. :结束插件的配置。
  11. :结束插件的定义。

这个插件配置的主要目的是设置 JAR 文件的 manifest,以便在运行时使用指定的类作为应用程序的入口点。通过添加默认实现入口和默认规范入口,可以确保应用程序能够正确地运行并提供一些额外的规范信息。这通常用于创建可执行 JAR 文件,其中包含应用程序的主类。

再看个类似的配置

<plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-jar-plugin</artifactId>  <version>2.3.1</version>  <configuration>  <archive>  <manifest>  <mainClass>com.artisan.MyTest</mainClass> <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries><addDefaultImplementationEntries>true</addDefaultImplementationEntries> </manifest><!-- 配置额外属性信息 --><manifestEntries>  <Plugin-Id>demo-plugin</Plugin-Id>  <Plugin-Version>1.0.0</Plugin-Version>  </manifestEntries>  </archive>  </configuration>  
</plugin> 

在之前的工程 POM 文件中添加上述构建插件重新进行打包,可以看到 MANIFEST.MF 文件中即添加了我们配置的额外属性。

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: great
Build-Jdk: 1.8.0_202
# Specification entries
Specification-Title: maven-v1
Specification-Version: 1.0-SNAPSHOT
# Implementation entries
Implementation-Title: maven-v1
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: com.artisan
# Manifest
Main-Class: com.artisan.MyTest
# ManifestEntries
Plugin-Id: demo-plugin
Plugin-Version: 1.0.0

maven-assembly-plugin

https://maven.apache.org/plugins/maven-assembly-plugin/
在这里插入图片描述

https://maven.apache.org/plugins/maven-assembly-plugin/examples/index.html

在这里插入图片描述

在普通 Maven 工程打包时默认仅会编译工程中新建的 java 文件并存储其 .class 文件,对于 POM 文件中引用的第三方依赖并不会一同打包。

如新建一个 Maven 工程并在依赖中导入 Jackson 依赖库并进行打包编译,可以看到下图编译后的 JAR 文件中只有工程中新建的 MyTest.class 文件,项目中所导入的依赖并没有被一起打包 .

在这里插入图片描述

而通过 assembly 插件即可将 POM 配置中的所有依赖一同打包编译至 JAR 文件中。

其中 execution 标签定义了 assembly 插件的作用阶段,如这里设置了在 Maven package 即打包阶段生效

<plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-assembly-plugin</artifactId>  <version>3.1.0</version>  <configuration>  <descriptorRefs>  <descriptorRef>jar-with-dependencies</descriptorRef>  </descriptorRefs>  <!-- Set jar file name --><finalName>${project.artifactId}-${project.version}-all</finalName>  <appendAssemblyId>false</appendAssemblyId>  <attach>false</attach>  <archive>  <manifest>  <mainClass>fully.qualified.MainClass</mainClass> <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries><addDefaultImplementationEntries>true</addDefaultImplementationEntries> </manifest>   </archive>  </configuration>  <executions>  <execution>  <!-- Set effect phase --><id>make-assembly</id>  <phase>package</phase>  <goals>  <goal>single</goal>  </goals>  </execution>  </executions>  
</plugin>

在工程 POM 配置中添加上述信息并重新编译打包工程,可以看到此时 JAR 文件中除了自定义创建的 MyTest.clss 文件外同时包含了依赖的第三方库。

在这里插入图片描述


另外一个Demo : Creating fat JARs using the Maven Assembly plugin

  1. Go to the pom.xml file and make sure the main application class is specified:
<properties><main.class>com.example.ApplicationKt</main.class>
</properties>
  1. If you use EngineMain without the explicit main function, the application’s main class depends on the used engine and might look as follows: io.ktor.server.netty.EngineMain.

Add maven-assembly-plugin to the plugins block as follows:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>2.6</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><addClasspath>true</addClasspath><mainClass>${main.class}</mainClass></manifest></archive></configuration><executions><execution><id>assemble-all</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions>
</plugin>
  1. Build an assembly

To build an assembly for the application, open the terminal and execute the following command:

mvn package

When this build completes, you should see the tutorial-server-get-started-maven-0.0.1-jar-with-dependencies.jar file in the target directory.

  1. Run the application

To run the built application:

Open the terminal and execute the following command to run the application:

java -jar target/tutorial-server-get-started-maven-0.0.1-jar-with-dependencies.jar

Wait until the following message is shown:

[main] INFO  Application - Responding at http://0.0.0.0:8080

You can click the link to open the application in a default browser:

在这里插入图片描述


maven-shade-plugin

https://maven.apache.org/plugins/maven-shade-plugin/

在这里插入图片描述

Shade 插件的功能更为强大,其提供了两个功能:

  • 第一个即与 assembly 类似可实现依赖的打包编译,与 assembly 不同的是 Shade 提供了更灵活的执行策略,可指定需要打包编译的依赖集合。

  • 另一个即实现包的重命名功能,我们都知道 Maven 并不允许在一共工程中同时引入单个依赖的不同版本,而通过 Shade 插件即可实现二次包装从而绕开该限制。

Shade 插件 - 标签

下面介绍一下 Shade 插件中各标签的使用。

artifactSet

通过 includes 标签可以指定需要一同打包编译的第三方依赖。

定义的格式为:groupId:artifactId。

<artifactSet>  <includes>  <include>groupId:artifactId</include>  </includes>  
</artifactSet>  

relocations

通过 relocations 标签即可实现模块的重命名功能。

其中 pattern 为需要重命名的模块包, shadedPattern 为重命名后的模块名。

<relocations>  <relocation>  <pattern>old.package.name</pattern>  <shadedPattern>new.package.name</shadedPattern>  </relocation>
</relocations>  

filters

通过 filters 标签可以实现非必要文件的排除,如常见的协议文件等,可通过文件名或类型实现匹配。

<filters>  <filter>  <artifact>*:*</artifact>  <excludes>  <exclude>filename</exclude>  <exclude>file pattern</exclude>  </excludes>  </filter>  
</filters>  

完整配置

Shade 同样可以通过 execution 设置作用阶段,上述介绍标签的完整配置内容如下:

<plugins>  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-shade-plugin</artifactId>  <version>3.2.0</version>  <executions>  <!-- Working phase -->  <execution>  <phase>package</phase>  <goals>  <goal>shade</goal>  </goals>  </execution>  </executions>  <configuration>  <minimizeJar>true</minimizeJar>  <!-- Defined what dependencies to pull into the uber JAR -->  <artifactSet>  <includes>  <include>com.fasterxml.jackson.core:jackson-core</include>  </includes>  </artifactSet>  <!-- Rename the package -->  <relocations>  <relocation>  <!-- Old name -->  <pattern>com.fasterxml.jackson.core</pattern>  <!-- New name -->  <shadedPattern>com.ibudai.fasterxml.jackson.core</shadedPattern>  </relocation>   </relocations>  <!-- Exclude the file that didn't want -->  <filters>  <filter>  <artifact>*:*</artifact>  <excludes>  <exclude>META-INF/license/**</exclude>  <exclude>META-INF/*</exclude>  <exclude>LICENSE</exclude>  <exclude>NOTICE</exclude>  </excludes>  </filter>  </filters>  </configuration>  </plugin>  
</plugins>

在之前的工程中添加上述配置并重新打包,可以看到编译后的 Jackson 模块包层级已经变成我们自定义的内容,而 Java 的类加载即通过类的完成限定名(包名+类名)来区分是否为同一个类,因此通过 Shade 插件即可实现 Maven 的单一工程多版本引入。

在这里插入图片描述
官方文档

https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/97374.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用yolov5进行安全帽检测填坑指南

参考项目 c​​​​​​​​​​​​​​GitHub - PeterH0323/Smart_Construction: Base on YOLOv5 Head Person Helmet Detection on Construction Sites&#xff0c;基于目标检测工地安全帽和禁入危险区域识别系统&#xff0c;&#x1f680;&#x1f606;附 YOLOv5 训练自己的…

visual studio 2022配置

前提&#xff1a;我linux c 开发 一直在使用vscode 更新了个版本突然代码中的查找所用引用和变量修改名称不能用了&#xff0c;尝试了重新配置clang vc都不行&#xff0c;估计是插件问题&#xff0c;一怒之下改用visual studio 2022 为了同步2个IDE之间的差别&#xff0c;目前…

知识继承概述

文章目录 知识继承第一章 知识继承概述1.背景介绍第一页 背景第二页 大模型训练成本示例第三页 知识继承的动机 2.知识继承的主要方法 第二章 基于知识蒸馏的知识继承预页 方法概览 1.知识蒸馏概述第一页 知识蒸馏概述第二页 知识蒸馏第三页 什么是知识第四页 知识蒸馏的核心目…

LeetCode_Java_2236. 判断根结点是否等于子结点之和

2236. 判断根结点是否等于子结点之和 给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左子结点和右子结点。 如果根结点值等于两个子结点值之和&#xff0c;返回 true &#xff0c;否则返回 false 。 示例1 输入&#xff1a;roo…

每天一道leetcode:剑指 Offer 34. 二叉树中和为某一值的路径(中等图论深度优先遍历递归)

今日份题目&#xff1a; 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例1 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…

SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)

前言&#xff1a;在实际项目开发中&#xff0c;可能会对一些用户的隐私信息进行脱敏操作&#xff0c;传统的方式很多都是用replace方法进行手动替换&#xff0c;这样会由很多冗余的代码并且后续也不好维护&#xff0c;本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去…

深入解析 Axios Blob 的使用方法及技巧

在 Web 开发中&#xff0c;处理文件传输是一个常见的需求。Blob&#xff08;二进制对象&#xff09;是一种表示二进制数据的方式&#xff0c;常用于处理文件和多媒体数据。本文将介绍如何使用 Axios 和 Blob 来处理文件传输。 Axios Blob 概念 在开始之前&#xff0c;让我们先…

Redis中常见的缓存穿透、缓存击穿、缓存雪崩、缓存预热解决方案

文章目录 一、缓存穿透1. 什么是缓存穿透2. 解决方案2.1 无效的key存放到Redis2.2 引入布隆过滤器2.3 如何选择&#xff1a; 二、缓存击穿1. 什么是缓存击穿2. 解决方案 三、缓存雪崩1. 什么是缓存雪崩2. 解决方案2.1 均匀过期2.2 热点数据缓存永远不过期2.3 采取限流降级的策略…

[ MySQL ] — 常见函数的使用

目录 日期函数 current_date — 获取当前日期 current_time — 获取当前时间 current_timestamp — 获取当前时间戳 date — 获取参数的日期部分 ​编辑 date_add — 在日期或时间的基础上进行增加 date_sub — 在日期或时间的基础上进行减少 datediff — 计算两个日期相差…

mysql主从复制最简单环境搭建(一主一从)

提示&#xff1a;前面有相应的文章利用不同方式进行的主从配置 文章目录 前言一、概述二、主从复制的优点三、原理四、搭建五、主库配置六、从库配置七、测试 前言 一、概述 主从复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上…

听GPT 讲Prometheus源代码--rules

Prometheus的rules目录主要包含规则引擎和管理规则的文件: engine.go 该文件定义了规则引擎的接口和主要结构,包括Rule,Record,RuleGroup等。它提供了规则的加载、匹配、评估和结果记录的功能。 api.go 定义了用于管理和查询规则的RESTful API,包括获取、添加、删除规则等方法。…

C国演义 [第十二章]

第十二章 打家劫舍题目理解步骤dp数组递推公式初始化遍历顺序 代码 打家劫舍II题目理解步骤递推公式初始化遍历顺序 代码 打家劫舍 力扣链接 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋…

『SpringBoot 源码分析』run() 方法执行流程:(1)初始化 SpringApplication 、上下文环境、应用上下文

『SpringBoot 源码分析』run() 方法执行流程&#xff1a;&#xff08;1&#xff09;初始化 SpringApplication 、上下文环境、应用上下文 基于 2.2.9.RELEASE问题&#xff1a;当方法进行了注释标记之后&#xff0c;springboot 又是怎么注入到容器中并创建类呢&#xff1f; 首…

Unity导入google.protobuf失败,无法找到google命名空间

问题&#xff1a; 1.刚开始把protobuf的文件夹直接从其他项目里(unity2021)里复制到unity(2020)版本&#xff0c;当时报错protobuf.dll的依赖项system.memory版本不对。 2.没有使用原来的protobuf文件了。使用vs2019的NuGet管理包来下载Google.Protobuf &#xff0c;仍然报错找…

机器学习基础之《分类算法(2)—K-近邻算法》

一、K-近邻算法(KNN) 1、定义 KNN K&#xff1a;就是一个自然数 N&#xff1a;nearest&#xff0c;最近的 N&#xff1a;neighbourhood&#xff0c;邻居 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这…

使用Edge和chrom扩展工具(GoFullPage)实现整页面截图或生成PDF文件

插件GoFullPage下载&#xff1a;点击免费下载 如果在浏览网页时&#xff0c;有需要整个页面截图或导出PDF文件的需求&#xff0c;这里分享一个Edge浏览器的扩展插件&#xff1a;GoFullPage。 这个工具可以一键实现页面从上到下滚动并截取。 一、打开“管理扩展”&#xff08;…

信息与通信工程面试准备——信号与系统|10:23

8月16日 23:21 目录 ​编辑 1. 调制的作用 2. 放大器与振荡器的作用和区别 工作原理 输出信号 应用 反馈方式 设计复杂度 装置性质 3. 信号与系统&#xff1a;三大变换之间的关系&#xff1f; 4. 无码间串扰的条件 5. 冲激函数的作用&#xff1f; 研究的意义&…

Python土力学与基础工程计算.PDF-钻探泥浆制备

Python 求解代码如下&#xff1a; 1. rho1 2.5 # 黏土密度&#xff0c;单位&#xff1a;t/m 2. rho2 1.0 # 泥浆密度&#xff0c;单位&#xff1a;t/m 3. rho3 1.0 # 水的密度&#xff0c;单位&#xff1a;t/m 4. V 1.0 # 泥浆容积&#xff0c;单位&#xff1a;…

Android Studio 新建module报错:No signature of method

android平台uni原生插件开发过程中&#xff0c;使用Android Studio 新增 module 报错 选择app --> create new module &#xff0c;填写相关信息 Android Studio 新建module报错&#xff1a; 原因&#xff1a;Android Studio 版本过高&#xff0c;新增了namespace&#x…

美团——城市低空物流无人机的设计挑战与应对

城市低空物流无人机的设计挑战与应对 强度分析 振动影响 动力设计 噪声设计 冗余备份更加性价比&#xff0c;便宜好实现 航电系统 动力系统的冗余 电池系统的冗余 通讯系统等冗余 降落冗余 安全降落 计算高效 产线标定 底层基础库 离线系统 行业公开测评 未来展望 – 导航定…