<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>知识分享</title><link>http://blogcenter.cn/</link><description>Good Luck To You!</description><item><title>纯真社区版IP库</title><link>http://blogcenter.cn/?id=254</link><description>&lt;div id=&quot;cnblogs_post_body&quot; class=&quot;blogpost-body cnblogs-markdown&quot;&gt;&lt;p&gt;纯真一直坚持回馈用户多年来的支持，从2005年开始发布免费的IP库。&lt;/p&gt;&lt;p&gt;纯真 (CZ88.net) 
作为全球网络空间地理测绘技术的先行者，秉持开源精神和共享软件理念为中国互联网行业提供了高质量的网络空间地理数据库。纯真IP库创立至今已服务超过16万企业和软件开发者，在中国互联网发展历史上留下广泛的印迹。纯真IP库为中国所有后续百花齐放的IP地理信息数据产品提供了开源根基。&lt;/p&gt;&lt;p&gt;社区版IP库综合用户通过纯真官网、纯真邮件、纯真专用数据采集APP等渠道提交的数据定期发布，欢迎关注我们的微信公众号获取纯真IP库的最新信息。&lt;/p&gt;&lt;p&gt;纯真社区版IP库以二进制(CZDB)的形式发布，配有开源的数据解析程序。该IP库文件同时支持IPv4和IPv6地理位置数据，具有占用内存小，访问速度快，线程安全，更新方便快捷的特点。&lt;/p&gt;&lt;p&gt;CZDB解析程序和使用文档我们已公开到GITHUB，以下为目前已支持的编程语言：&lt;/p&gt;&lt;p&gt;★ JAVA语言 &lt;a href=&quot;https://github.com/tagphi/czdb-search-java&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;https://github.com/tagphi/czdb-search-java&lt;/a&gt;&lt;br/&gt;★ PHP语言 &lt;a href=&quot;https://github.com/tagphi/czdb_searcher_php&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;https://github.com/tagphi/czdb_searcher_php&lt;/a&gt;&lt;br/&gt;★ C语言 &lt;a href=&quot;https://github.com/tagphi/czdb-search-c&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;https://github.com/tagphi/czdb-search-c&lt;/a&gt;&lt;br/&gt;★ Node.js 语言解析程序 &lt;a href=&quot;https://github.com/limkim0530/czdb-search-node&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;https://github.com/limkim0530/czdb-search-node&lt;/a&gt;&lt;br/&gt;★ Python 语言解析程序 &lt;a href=&quot;https://github.com/tagphi/czdb_searcher_python&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;https://github.com/tagphi/czdb_searcher_python&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;IP地址位置数据由&lt;a href=&quot;https://www.cz88.neta&quot; target=&quot;_blank&quot; textvalue=&quot;纯真CZ88&quot;&gt;纯真CZ88提供支持&lt;a href=&quot;https://www.cz88.neta&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Mon, 17 Feb 2025 18:30:18 +0800</pubDate></item><item><title>clickhouse 安装</title><link>http://blogcenter.cn/?id=253</link><description>&lt;h3 id=&quot;blogTitle0&quot;&gt;楔子&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;相较于 Hadoop 生态圈中的一些系统，ClickHouse 的安装显得尤为简单，因为它自成一体，在单节点的情况下不需要额外的依赖，集群的话后面会说。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ClickHouse 支持运行在主流 64 位 CPU 架构的 Linux 操作系统上，可以通过源码编译、预编译压缩包、Docker 镜像和 RPM 等多种方法进行安装。这里我们着重介绍一下离线 RPM 的安装方法，因为它最常用。&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;这里我使用的系统是 CentOS 7.6。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;p&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;1）下载 RPM 安装包&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;RPM 包可以从仓库 &lt;a href=&quot;https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/&lt;/a&gt; 中进行下载，里面包含了所有版本的 ClickHouse，这里我选择的版本是 21.7.3.14-2。因此需要下载如下文件：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;clickhouse-client-21.7.3.14-2.noarch.rpm
clickhouse-common-static-21.7.3.14-2.x86_64.rpm
clickhouse-common-static-dbg-21.7.3.14-2.x86_64.rpm
clickhouse-server-21.7.3.14-2.noarch.rpm&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;2）关闭防火墙并检查环境依赖&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;考虑到后续的集群部署，通常建议关闭本机的防火墙，在 CentOS 7 中关闭防火墙的方法如下：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;#&amp;nbsp;关闭防火墙systemctl&amp;nbsp;stop&amp;nbsp;firewalld.service#&amp;nbsp;禁用开机启动项systemctl&amp;nbsp;disable&amp;nbsp;firewalld.service&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;接着需要验证当前服务器的 CPU 是否支持 SSE 4.2 指令集，因为向量化执行需要用到这项特性：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;grep&amp;nbsp;-q&amp;nbsp;sse4_2&amp;nbsp;/proc/cpuinfo&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;echo&amp;nbsp;&amp;quot;支持&amp;nbsp;SSE&amp;nbsp;4.2&amp;nbsp;指令集&amp;quot;&amp;nbsp;||&amp;nbsp;echo&amp;nbsp;&amp;quot;不支持&amp;nbsp;SSE&amp;nbsp;4.2&amp;nbsp;指令集&amp;quot;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115934_17608.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果不支持 SSE 指令集，则不能使用上面下载的 RPM 安装包，而是需要使用源码编译的方式安装，当然现在的 CPU 基本上都是支持的。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;3）安装 ClickHouse&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;我们将上面下载的 RPM 包上传到服务器，然后进行安装。&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;#&amp;nbsp;使用通配符，会将当前目录下所有的&amp;nbsp;rpm&amp;nbsp;包依次安装，非常方便#&amp;nbsp;因为我们是安装&amp;nbsp;ClickHouse，所以该目录除了&amp;nbsp;ClickHouse&amp;nbsp;的&amp;nbsp;rpm&amp;nbsp;包之外，最好不要有其它的&amp;nbsp;rpm&amp;nbsp;包rpm&amp;nbsp;-ivh&amp;nbsp;./*.rpm&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;注意，在安装到 clickhouse-server 的时候会提示你设置密码：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115935_42407.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;因为 ClickHouse 在安装的时候会有一个默认的 default 用户，这里会提示你给 default 
设置密码，因为 ClickHouse 和 MySQL、PostgreSQL 
等数据库一样，也具有用户管理权限。老版本默认没有密码，新版本会让你主动设置，这里我们就不设置了，直接回车就好，这样后续在连接的时候就不需要密码了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最后，如果想卸载 ClickHouse 也很简单，只需以下几步：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;yum&amp;nbsp;remove&amp;nbsp;clickhouse-client&amp;nbsp;clickhouse-common-static&amp;nbsp;clickhouse-common-static-dbg&amp;nbsp;clickhouse-server&amp;nbsp;-yrm&amp;nbsp;-rf&amp;nbsp;/var/lib/clickhouserm&amp;nbsp;-rf&amp;nbsp;/etc/clickhouse-*rm&amp;nbsp;-rf&amp;nbsp;/var/log/clickhouse-server&lt;/pre&gt;&lt;h3 id=&quot;blogTitle1&quot;&gt;目录结构&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;程序在安装的时候会自动构建整套目录结构，接下来分别说明它们的作用。&lt;/strong&gt;&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;1) 首先是核心目录部分&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/etc/clickhouse-server：服务端的配置文件目录, 包括全局配置 config.xml 和用户配置 users.xml 等。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115935_44688.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/var/lib/clickhouse：默认的数据存储目录（通常会修改默认存储路径，将数据保存到大容量磁盘挂载的路径），通过 config.xml 进行修改。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/var/log/clickhouse-server：默认保存日志的目录（通常会修改默认存储路径，将日志保存到大容量磁盘挂载的路径），通过 config.xml 进行修改。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;2) 接下来是配置文件部分&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/etc/security/limits.d/clickhouse.conf：文件句柄数量的配置，默认值如下所示：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;[root@satori&amp;nbsp;~]#&amp;nbsp;cat&amp;nbsp;/etc/security/limits.d/clickhouse.confclickhouse	soft	nofile	262144
clickhouse	hard	nofile	262144
[root@satori&amp;nbsp;~]#&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;该配置也可以通过 config.xml 中的 max_open_files 参数指定。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/etc/cron.d/clickhouse-server：cron 定时任务配置，用于恢复异常中断的 ClickHouse 服务进程，其默认的配置如下所示：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;[root@satori&amp;nbsp;~]#&amp;nbsp;cat&amp;nbsp;/etc/cron.d/clickhouse-server#*/10&amp;nbsp;*&amp;nbsp;*&amp;nbsp;*&amp;nbsp;*&amp;nbsp;root&amp;nbsp;((which&amp;nbsp;service&amp;nbsp;&amp;gt;&amp;nbsp;/dev/null&amp;nbsp;2&amp;gt;&amp;amp;1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(service&amp;nbsp;clickhouse-server&amp;nbsp;condstart&amp;nbsp;||:))&amp;nbsp;||&amp;nbsp;/etc/init.d/clickhouse-server&amp;nbsp;condstart)&amp;nbsp;&amp;gt;&amp;nbsp;/dev/null&amp;nbsp;2&amp;gt;&amp;amp;1[root@satori&amp;nbsp;~]#&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;可以看到默认每隔 10 秒就会使用 condstart 尝试启动一次 ClickHouse 服务，如果 ClickHouse 服务正在运行，则跳过；如果没有运行，则启动。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;3) 最后是在 /usr/bin 目录下的启动文件&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ClickHouse 相关的启动文件都位于 /usr/bin 目录下。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115935_12137.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;可执行文件数量还是蛮多的，其中四个最常用。&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;clickhouse: 主程序的可执行文件&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;clickhouse-client: 一个指向 ClickHouse 可执行文件的软连接, 供客户端连接使用&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;clickhouse-server: 一个指向 ClickHouse 可执行文件的软连接, 供服务端启动使用&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;clickhouse-compressor: 内置提供的压缩工具, 可用于数据的正压反解&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;blogTitle2&quot;&gt;启动命令&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;ClickHouse 给我们提供了非常优雅的启动方式。&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;启动 ClickHouse：clickhouse start&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;关闭 ClickHouse：clickhouse stop&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;重启 ClickHouse：clickhouse restart&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;注意：在安装 ClickHouse 的时候，系统会自动创建一个名为 clickhouse 的用户，启动脚本会基于此用户来启动服务。因此我们需要让 clickhouse 用户具备相关目录的权限，如果不赋权限，ClickHouse 可能会启动失败。&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;chown&amp;nbsp;clickhouse.clickhouse&amp;nbsp;/var/log/clickhouse-server/&amp;nbsp;-R&amp;nbsp;
chown&amp;nbsp;clickhouse.clickhouse&amp;nbsp;/var/lib/clickhouse/&amp;nbsp;-R&amp;nbsp;
#&amp;nbsp;如果后续你修改了配置文件，改变了&amp;nbsp;ClickHouse&amp;nbsp;的数据存储目录，那么也要记得赋给它相应的权限&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;另外，上面通过 clickhouse start 启动的时候我们没有指定配置文件，没错，通过这种方式启动的话，会自动加载 /etc/clickhouse-server/config.xml。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;但如果我们想手动指定配置文件的话，那么需要使用 clickhouse-server。&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;clickhouse-server&amp;nbsp;--config-file&amp;nbsp;/etc/clickhouse-server/config.xml&amp;nbsp;--daemon&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;--config-file 负责指定配置文件，这样即使将配置文件放在了别的地方也没有关系，因为我们可以显式地指定它的位置；--daemon 表示后台启动，因为默认是前台启动的。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;但是注意：使用 clickhouse-server 启动的话，不能使用 root 用户，需要切换到 clickhouse 用户，所以我们应该这么做。&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;sudo&amp;nbsp;-u&amp;nbsp;clickhouse&amp;nbsp;clickhouse-server&amp;nbsp;--config-file&amp;nbsp;/etc/clickhouse-server/config.xml&amp;nbsp;--daemon&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;注意：sudo -u 后面的 clickhouse 指的是名为 clickhouse 的用户，而 clickhouse 
start 里面的 clickhouse 指的是 /usr/bin 里面的可执行文件。这里由于我们配置文件就在默认路径下，所以也可以直接使用 
clickhouse start 启动，默认加载 
/etc/clickhouse-server/config.xml、并且后台启动。至于关闭的话，直接 clickhouse stop 即可。&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;blogTitle3&quot;&gt;客户端的访问接口&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;ClickHouse 服务端的底层访问接口支持 TCP 和 HTTP 两种方式，其中 TCP 拥有更好的性能，默认监听 
9000 端口，主要用于集群间的内部通信及 clickhouse-client 客户端的连接；而 HTTP 协议则拥有更好的兼容性，可以通过 
REST 服务的形式被广泛用于编程语言的客户端，默认监听 8123 端口。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下面我们来介绍几种连接方式。&lt;/strong&gt;&lt;/p&gt;&lt;h4 id=&quot;使用客户端-clickhouse-client-连接服务端&quot;&gt;使用客户端 clickhouse-client 连接服务端&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;通过 clickhouse start 将服务启动之后，我们就可以使用客户端进行连接了，通过 clickhouse-client，默认会连接到本机的 9000 端口，并使用 default 用户，如果想单独指定的话可使用如下方式：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;clickhouse-client&amp;nbsp;--host&amp;nbsp;地址&amp;nbsp;--port&amp;nbsp;端口&amp;nbsp;--user&amp;nbsp;用户&amp;nbsp;--password&amp;nbsp;密码&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;这里我们的服务端默认监听 9000 端口，并且 default 用户还没有密码，所以直接输入 clickhouse-client 即可连接上。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115936_95779.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;我们看到连接成功，并且也查询成功了，到此单节点 ClickHouse 的安装就算完毕了，至于集群的搭建后面会说。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;插句题外话，如果我们想要更新 ClickHouse，那么直接下载新版的 ClickHouse RPM 包即可，然后进行更新：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;rpm&amp;nbsp;-Uvh&amp;nbsp;./*.rpm&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;升级的时候，原有的配置均会保留。&lt;/strong&gt;&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;&lt;strong&gt;然后再来补充一下 clickhouse-client 的内容，上面通过输入 clickhouse-client 
进入命令行、然后再执行 SQL 的方式叫做 &amp;quot;交互式执行&amp;quot;，一般用于调试、运维、开发和测试等场景。通过交互式执行的 SQL 
语句，相关查询结果会统一记录到 ~/.clickhouse-client-history 文件中，可以作为审计之用。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115936_13524.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;但除了交互式执行之外，还有非交互式执行。非交互式执行主要用于批处理场景，诸如对数据的导入和导出操作，在执行脚本命令时，需要追加 --query 参数指定执行的 SQL 语句。举个栗子：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;cat&amp;nbsp;xxx.csv&amp;nbsp;|&amp;nbsp;clickhouse-client&amp;nbsp;--query&amp;nbsp;&amp;quot;INSERT&amp;nbsp;INTO&amp;nbsp;some_table&amp;nbsp;FORMAT&amp;nbsp;CSV&amp;quot;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;在导入数据时，它可以接收操作系统的 stdin 标准输入作为写入的数据。所以 cat 命令读取的文件流，将会作为 INSERT 语句的数据输入，而在数据导出时，则可以将输出流重定向到文件：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;clickhouse-client&amp;nbsp;--query&amp;nbsp;&amp;quot;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;some_table&amp;quot;&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;xxx.csv&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;默认情况下，clickhouse-client 一次只能运行一条 SQL 
语句，如果需要执行多次查询，则需要在循环中重复执行，这显然不是一种高效的方式。此时可以追加 --multiquery 
参数，它可以支持一次运行多条 SQL 查询，多条查询之间使用分号分隔，比如：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115937_87312.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;多条 SQL 的查询结果集会依次按照顺序返回。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;以上就是 clickhouse-client 的两种运行方式，由于提供了非交互式执行的功能，所以 ClickHouse 的客户端比其它数据库的客户端要强大一些。下面整理一下 clickhouse-client 常用的相关参数：&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--host/-h: 指定连接的服务端的地址, 默认是 localhost，如果服务端的地址不是 localhost, 则需要依靠此参数进行指定, 例如 clickhouse-client -h xx.xx.xx.xx&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--port: 服务端的 TCP 端口, 默认是 9000，如果服务端监听的不是 9000, 则需要此参数指定&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--user/-u: 登录的用户名, 默认是 default。如果使用非 default 的用户名登录, 则需要使用此参数指定&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--password: 登录的密码, 默认值为空。如果在用户定义中未设置密码, 则无需填写（比如默认的 default 用户，我们没有设置密码）&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--database/-d: 登录之后所在的数据库, 默认为 default&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--query/-q: 只能在非交互式查询时使用, 用于执行指定的 SQL 语句&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--multiquery/-n: 在非交互式执行时, 允许一次运行多条 SQL 语句, 多条语句之间用分号隔开&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--time/-t: 在非交互式执行时, 会打印每条 SQL 的执行时间&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;更多参数可以通过 clickhouse-client --help 查看，数量多到恐怖。&lt;/strong&gt;&lt;/p&gt;&lt;h4 id=&quot;python-连接-clickhouse-服务端&quot;&gt;Python 连接 ClickHouse 服务端&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;首先 ClickHouse 支持使用 JDBC 连接，但我本身不是 JAVA 方向的，所以这里只介绍使用 Python 连接 ClickHouse 的方式。&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Python 连接 ClickHouse 的话需要安装一个第三方库，直接 pip install clickhouse-driver 即可。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;注意：我们说 HTTP 协议使用的是 8123 端口，但 Python 这个包比较特殊，它和 clickhouse-client 一样，使用的也是 TCP 协议，也就是说端口需要指定为 9000。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115937_47073.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用 Python 是可以连接的，但是注意：我们这里是在服务器上使用 Python 连接的，如果需要在其它机器上连接的话，那么就不能使用 localhost 了。&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;from&amp;nbsp;clickhouse_driver&amp;nbsp;import&amp;nbsp;Client#&amp;nbsp;需要指定具体的&amp;nbsp;ipclient&amp;nbsp;=&amp;nbsp;Client(host=&amp;quot;47.94.174.89&amp;quot;,&amp;nbsp;port=9000)print(client.execute(&amp;quot;show&amp;nbsp;databases&amp;quot;))&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;不过此时仍无法在其它节点上访问，因为我们还需要修改一下服务端的配置，vim /etc/clickhouse-server/config.xml：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115937_75167.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;listen_host 这个标签默认是被注释掉的，也就是只监听来自本机的请求。这里我们将注释打开，或者不管注释，直接手动增加一条。&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;&amp;lt;!--&amp;nbsp;改成&amp;nbsp;0.0.0.0，这样即可接收来自其它机器上的请求&amp;nbsp;--&amp;gt;&amp;lt;listen_host&amp;gt;0.0.0.0&amp;lt;/listen_host&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;此时 Python 即可在其它节点上访问了，注意：服务器的 9000 端口要对外开放。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115938_87349.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;此外我们还可以通过 sqlalchemy 去连接，但是默认情况下 sqlalchemy 找不到对应的 
dialect，所以需要再安装一个模块：pip install 
sqlalchemy_clickhouse，安装之后就可以使用了。但有一点需要注意：使用 sqlalchemy_clickhouse 
的话，那么连接的端口就不是 9000 了，而是 8123。更准确的说，需要使用 HTTP 端口。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115938_35063.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;以上就是 Python 连接 ClickHouse 的两种方式，还是挺容易的。&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;blogTitle4&quot;&gt;内置的实用工具&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;我们说 /usr/bin 下面包含了很多关于 ClickHouse 的启动文件，除了之前介绍的四个，这里再介绍两个，分别是 clickhouse-local 和 clickhouse-benchmark。&lt;/strong&gt;&lt;/p&gt;&lt;h4 id=&quot;clickhouse-local&quot;&gt;clickhouse-local&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;clickhouse-local 可以独立运行大部分的 SQL 查询，不需要依赖任何 ClickHouse 
服务端程序，它可以理解为 ClickHouse 服务的单机版内核，是一个轻量级的应用程序。clickhouse-local 只能使用 File 
引擎（关于引擎后面会展开），它的数据与同机运行的 ClickHouse 服务之间也是完全隔离的，不能互相访问。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;clickhouse-local 是非交互式的，每次执行都需要指定数据来源，例如通过 stdin 标准输入，以 echo 打印作为数据来源：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115938_36853.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;也可以借助操作系统的命令，实现对系统用户内存使用量的查询。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/04/20240409115938_20307.png&quot; alt=&quot;&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;clickhouse-local 的参数用法可以通过 --help 查看，但个人觉得不是很常用。&lt;/strong&gt;&lt;/p&gt;&lt;h4 id=&quot;clickhouse-benchmark&quot;&gt;clickhouse-benchmark&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;clickhouse-benchmark 是基准测试的小工具，它可以自动运行 SQL 查询，并生成对应的运行指标报告，例如执行下面的语句启动测试：&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot;&gt;echo&amp;nbsp;&amp;quot;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;table&amp;quot;&amp;nbsp;|&amp;nbsp;clickhouse-benchmark&amp;nbsp;-i&amp;nbsp;5&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;按照指定参数的查询会被执行 5 次，执行完毕之后，会显示包含 QPS、RPS 等指标信息的报告，还会列出各百分位的查询执行时间。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果想测试多条 SQL，此时就需要将 SQL 写在文件中，然后通过 clickhouse-benchmark -i 5 &amp;lt; 文件路径，将里面的 SQL 按照顺序依次执行。&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;这里我就不使用具体的数据测试了，有兴趣可以自己尝试一下。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;clickhouse-benchmark 的一些核心参数可以通过 --help 查看。&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;blogTitle5&quot;&gt;小结&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;以上我们就介绍了基于离线 RPM 包安装 ClickHouse 的整个过程，当然也可以使用其它方式安装，比如在线安装、使用
 Docker 安装等等。事实上，这种离线安装的方式也不麻烦，相反个人觉得还很简单。然后还介绍了访问 ClickHouse 的两个接口：TCP 
接口和 HTTP 接口，以及如何使用 Python 去访问。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下一篇文章我们就来学习 ClickHouse 的具体语法了，首先会从数据定义开始。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原文：https://www.cnblogs.com/wan-ming-zhu/p/18092504&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 09 Apr 2024 11:58:41 +0800</pubDate></item><item><title>Docker 搭建 Minio 容器 (完整详细版)</title><link>http://blogcenter.cn/?id=252</link><description>&lt;p&gt;Docker 搭建 Minio 容器 (完整详细版)&lt;br/&gt;简介：&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minio 是一个基于Apache License v2.0开源协议的对象存储服务，虽然轻量，却拥有着不错的性能。它兼容亚马逊S3云存储服务接口，非常适合于存储大容量非结构化的数据。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等，而一个对象文件可以是任意大小，从几 kb 到最大 5T 不等。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最重要的是免费&lt;br/&gt;&lt;br/&gt;说明：&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Docker如果想安装软件 , 必须先到Docker镜像仓库下载镜像。&lt;br/&gt;&lt;br/&gt;Docker官方镜像&lt;br/&gt;1、寻找Minio镜像&lt;br/&gt;&lt;br/&gt;image-20231129205553602&lt;br/&gt;&lt;br/&gt;image-20231130160039562&lt;br/&gt;2、下载Minio镜像&lt;br/&gt;&lt;br/&gt;# 下载镜像&lt;br/&gt;docker pull minio/minio&lt;br/&gt;&lt;br/&gt;#查看镜像&lt;br/&gt;docker images&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;命令&amp;nbsp;&amp;nbsp; &amp;nbsp;描述&lt;br/&gt;docker pull minio/minio&amp;nbsp;&amp;nbsp; &amp;nbsp;下载最新版Minio镜像 (其实此命令就等同于 : docker pull minio/minio:latest )&lt;br/&gt;docker pull minio/minio:RELEASE.2023-11-20T22-40-07Z.fips&amp;nbsp;&amp;nbsp; &amp;nbsp;下载指定版本的Minio镜像 (xxx指具体版本号)&lt;br/&gt;&lt;br/&gt;image-20231129210410277&lt;br/&gt;3、创建目录&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一个用来存放配置，一个用来存储上传文件的目录&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 启动前需要先创建Minio外部挂载的配置文件（ /opt/minio/config）,和存储上传文件的目录（ /opt/minio/data）&lt;br/&gt;&lt;br/&gt;mkdir -p /opt/minio/config&lt;br/&gt;&lt;br/&gt;mkdir -p /opt/minio/data&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br/&gt;&lt;br/&gt;4、创建Minio容器并运行&lt;br/&gt;&lt;br/&gt;docker run \&lt;br/&gt;-p 19000:9000 \&lt;br/&gt;-p 9090:9090 \&lt;br/&gt;--net=host \&lt;br/&gt;--name minio \&lt;br/&gt;-d --restart=always \&lt;br/&gt;-e &amp;quot;MINIO_ACCESS_KEY=minioadmin&amp;quot; \&lt;br/&gt;-e &amp;quot;MINIO_SECRET_KEY=minioadmin&amp;quot; \&lt;br/&gt;-v /opt/minio/data:/data \&lt;br/&gt;-v /opt/minio/config:/root/.minio \&lt;br/&gt;&amp;nbsp;minio/minio server \&lt;br/&gt;/data --console-address &amp;quot;:9090&amp;quot; -address &amp;quot;:19000&amp;quot;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;命令&amp;nbsp;&amp;nbsp; &amp;nbsp;描述&lt;br/&gt;-p 9000:9000 -p 9090:9090&amp;nbsp;&amp;nbsp; &amp;nbsp;这是端口映射，前一个是服务器的端口，后一个是客户端也就是api接口访问的端口地址&lt;br/&gt;–name minio&amp;nbsp;&amp;nbsp; &amp;nbsp;这是给新创建的容器命名的选项，名字是 “minio”&lt;br/&gt;–net=host&amp;nbsp;&amp;nbsp; &amp;nbsp;这是网络设置，表示容器将使用主机的网络栈，这样就不需要在容器内部配置网络&lt;br/&gt;-d --restart=always&amp;nbsp;&amp;nbsp; &amp;nbsp;这是运行容器的其他选项，-d使容器在后台运行，–restart=always表示容器总是会在退出后自动重启&lt;br/&gt;-e “MINIO_ACCESS_KEY=minioadmin”&amp;nbsp;&amp;nbsp; &amp;nbsp;用户名&lt;br/&gt;-e “MINIO_SECRET_KEY=minioadmin”&amp;nbsp;&amp;nbsp; &amp;nbsp;密码&lt;br/&gt;-v /opt/minio/data:/data&amp;nbsp;&amp;nbsp; &amp;nbsp;这意味着将宿主机上的 /opt/minio/data 目录挂载到容器内的 /data 目录&lt;br/&gt;-v /opt/minio/config:/root/.minio&amp;nbsp;&amp;nbsp; &amp;nbsp;将宿主机上的 /opt/minio/config 目录挂载到容器内的 /root/.minio 目录&lt;br/&gt;minio/minio server /data --console-address “:9090” -address “:9000”&amp;nbsp;&amp;nbsp; &amp;nbsp;这是容器内要运行的命令，启动一个名为 “minio” 的服务器，数据存储在 /data 目录下，服务器的控制台地址为 “:9090”，服务地址为 “:9000”&lt;br/&gt;\&amp;nbsp;&amp;nbsp; &amp;nbsp;换行&lt;br/&gt;4.1、访问操作&lt;br/&gt;&lt;br/&gt;访问：http://47.117.160.102:9090/login 用户名：密码 minioadmin：minioadmin&lt;br/&gt;&lt;br/&gt;image-20231130165641764&lt;br/&gt;4.2、创建用户&lt;br/&gt;&lt;br/&gt;image-20231130173302737&lt;br/&gt;&lt;br/&gt;image-20231130173436591&lt;br/&gt;4.3、创建组&lt;br/&gt;&lt;br/&gt;image-20231130173619690&lt;br/&gt;&lt;br/&gt;image-20231130173728073&lt;br/&gt;4.4、创建Buckets&lt;br/&gt;&lt;br/&gt;image-20231130195452040&lt;br/&gt;&lt;br/&gt;image-20231130195548997&lt;br/&gt;4.5、创建Access Keys&lt;br/&gt;&lt;br/&gt;image-20231130195953522&lt;br/&gt;4.6、文件上传&lt;br/&gt;&lt;br/&gt;image-20231201195412713&lt;br/&gt;4.6、浏览器访问上传文件&lt;br/&gt;&lt;br/&gt;image-20231201195651424&lt;br/&gt;4.6.1、输入ip:19000/Buckets名/文件名，如果不行，看看端口是否开放&lt;br/&gt;&lt;br/&gt;image-20231201195743467&lt;br/&gt;5、Springboot简单使用&lt;br/&gt;5.1、添加MinIO依赖Pom&lt;br/&gt;&lt;br/&gt;&amp;lt;dependencies&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- MinIO 客户端 --&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;io.minio&amp;lt;/groupId&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;minio&amp;lt;/artifactId&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;8.5.7&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;3.11&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br/&gt;&amp;lt;/dependencies&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br/&gt;&lt;br/&gt;5.2、配置MinIO的yaml&lt;br/&gt;&lt;br/&gt;server:&lt;br/&gt;&amp;nbsp; port: 3333&lt;br/&gt;&lt;br/&gt;spring:&lt;br/&gt;&amp;nbsp; servlet:&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; multipart:&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; max-request-size: 200MB&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; max-file-size: 200MB&lt;br/&gt;&lt;br/&gt;minio:&lt;br/&gt;&amp;nbsp; url: http://127.0.0.1:19000 #换成自己的minio服务端地址&lt;br/&gt;&amp;nbsp; accessKey: minioadmin # 用户名&lt;br/&gt;&amp;nbsp; secretKey: minioadmin # 密码&lt;br/&gt;&amp;nbsp; bucketName: demo&amp;nbsp; # bucketName指的就是之前创建的MinIO桶Bucket&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br/&gt;&lt;br/&gt;5.3、配置类Config&lt;br/&gt;&lt;br/&gt;/**&lt;br/&gt;&amp;nbsp;* @author HAOYANG&lt;br/&gt;&amp;nbsp;* @create 2023-12-01 20:40&lt;br/&gt;&amp;nbsp;*/&lt;br/&gt;@Data&lt;br/&gt;@Configuration&lt;br/&gt;public class MinioConfig {&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 访问地址&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Value(&amp;quot;${minio.url}&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String endpoint;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * accessKey类似于用户ID，用于唯一标识你的账户&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Value(&amp;quot;${minio.accessKey}&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String accessKey;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * secretKey是你账户的密码&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Value(&amp;quot;${minio.secretKey}&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String secretKey;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 默认存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Value(&amp;quot;${minio.bucketName}&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String bucketName;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Bean&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MinioClient minioClient() {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MinioClient minioClient = MinioClient.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .endpoint(endpoint)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .credentials(accessKey, secretKey)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; &lt;br/&gt;&lt;br/&gt;5.4、创建MinIO工具类&lt;br/&gt;&lt;br/&gt;/**&lt;br/&gt;&amp;nbsp;* MinIO工具类&lt;br/&gt;&amp;nbsp;*&lt;br/&gt;&amp;nbsp;*/&lt;br/&gt;@Slf4j&lt;br/&gt;@Component&lt;br/&gt;@RequiredArgsConstructor&lt;br/&gt;public class MinioUtils {&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final MinioClient minioClient;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /******************************&amp;nbsp; Operate Bucket Start&amp;nbsp; ******************************/&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 启动SpringBoot容器的时候初始化Bucket&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 如果没有Bucket则创建&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void createBucket(String bucketName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!bucketExists(bucketName)) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 判断Bucket是否存在，true：存在，false：不存在&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean bucketExists(String bucketName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获得Bucket的策略&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getBucketPolicy(String bucketName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.getBucketPolicy(GetBucketPolicyArgs&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获得所有Bucket列表&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;Bucket&amp;gt; getAllBuckets() {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.listBuckets();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 根据bucketName获取其相关信息&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Optional&amp;lt;Bucket&amp;gt; getBucket(String bucketName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return getAllBuckets().stream().filter(b -&amp;gt; b.name().equals(bucketName)).findFirst();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 根据bucketName删除Bucket，true：删除成功； false：删除失败，文件或已不存在&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @throws Exception&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void removeBucket(String bucketName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /******************************&amp;nbsp; Operate Bucket End&amp;nbsp; ******************************/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /******************************&amp;nbsp; Operate Files Start&amp;nbsp; ******************************/&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 判断文件是否存在&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean isObjectExist(String bucketName, String objectName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boolean exist = true;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.error(&amp;quot;[Minio工具类]&amp;gt;&amp;gt;&amp;gt;&amp;gt; 判断文件是否存在, 异常：&amp;quot;, e);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exist = false;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return exist;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 判断文件夹是否存在&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean isFolderExist(String bucketName, String objectName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boolean exist = false;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iterable&amp;lt;Result&amp;lt;Item&amp;gt;&amp;gt; results = minioClient.listObjects(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(false).build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (Result&amp;lt;Item&amp;gt; result : results) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item item = result.get();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (item.isDir() &amp;amp;&amp;amp; objectName.equals(item.objectName())) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exist = true;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.error(&amp;quot;[Minio工具类]&amp;gt;&amp;gt;&amp;gt;&amp;gt; 判断文件夹是否存在，异常：&amp;quot;, e);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exist = false;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return exist;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 根据文件前置查询文件&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param prefix&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前缀&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param recursive&amp;nbsp; 是否使用递归查询&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return MinioItem 列表&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;Item&amp;gt; getAllObjectsByPrefix(String bucketName,&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String prefix,&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boolean recursive) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Item&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iterable&amp;lt;Result&amp;lt;Item&amp;gt;&amp;gt; objectsIterator = minioClient.listObjects(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).recursive(recursive).build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (objectsIterator != null) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (Result&amp;lt;Item&amp;gt; o : objectsIterator) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item item = o.get();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.add(item);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return list;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获取文件流&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName 文件名&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return 二进制流&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public InputStream getObject(String bucketName, String objectName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.getObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 断点下载&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName 文件名称&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 起始字节的位置&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要读取的长度&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return 二进制流&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public InputStream getObject(String bucketName, String objectName, long offset, long length) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.getObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .offset(offset)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .length(length)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获取路径下文件列表&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param prefix&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 文件名称&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param recursive&amp;nbsp; 是否递归查找，false：模拟文件夹结构查找&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return 二进制流&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Iterable&amp;lt;Result&amp;lt;Item&amp;gt;&amp;gt; listObjects(String bucketName, String prefix, boolean recursive) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.listObjects(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ListObjectsArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .prefix(prefix)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .recursive(recursive)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 使用MultipartFile进行文件上传&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&amp;nbsp; 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param file&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 文件名&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName&amp;nbsp; 对象名&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param contentType 类型&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ObjectWriteResponse uploadFile(String bucketName, MultipartFile file, String objectName, String contentType) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream inputStream = file.getInputStream();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.putObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PutObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .contentType(contentType)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .stream(inputStream, inputStream.available(), -1)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 图片上传&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param imageBase64&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param imageName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ObjectWriteResponse uploadImage(String bucketName, String imageBase64, String imageName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!StringUtils.isEmpty(imageBase64)) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream in = base64ToInputStream(imageBase64);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String newName = System.currentTimeMillis() + &amp;quot;_&amp;quot; + imageName + &amp;quot;.jpg&amp;quot;;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String year = String.valueOf(new Date().getYear());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String month = String.valueOf(new Date().getMonth());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return uploadFile(bucketName, year + &amp;quot;/&amp;quot; + month + &amp;quot;/&amp;quot; + newName, in);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;// BASE64Decoder在jdk8以上的版本移除了，报错最简单解决换成jdk8就行了&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static InputStream base64ToInputStream(String base64) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ByteArrayInputStream stream = null;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] bytes = new BASE64Decoder().decodeBuffer(base64.trim());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stream = new ByteArrayInputStream(bytes);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return stream;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 上传本地文件&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName 对象名称&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param fileName&amp;nbsp;&amp;nbsp; 本地文件路径&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ObjectWriteResponse uploadFile(String bucketName, String objectName, String fileName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.uploadObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UploadObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .filename(fileName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 通过流上传文件&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&amp;nbsp; 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName&amp;nbsp; 文件对象&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param inputStream 文件流&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ObjectWriteResponse uploadFile(String bucketName, String objectName, InputStream inputStream) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.putObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PutObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .stream(inputStream, inputStream.available(), -1)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 创建文件夹或目录&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName 目录路径&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ObjectWriteResponse createDir(String bucketName, String objectName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.putObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PutObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .stream(new ByteArrayInputStream(new byte[]{}), 0, -1)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获取文件信息, 如果抛出异常则说明文件不存在&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName 文件名称&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getFileStatusInfo(String bucketName, String objectName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.statObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StatObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build()).toString();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 拷贝文件&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&amp;nbsp;&amp;nbsp;&amp;nbsp; 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName&amp;nbsp;&amp;nbsp;&amp;nbsp; 文件名&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param srcBucketName 目标存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param srcObjectName 目标文件名&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ObjectWriteResponse copyFile(String bucketName, String objectName, String srcBucketName, String srcObjectName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.copyObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CopyObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .source(CopySource.builder().bucket(bucketName).object(objectName).build())&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(srcBucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(srcObjectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 删除文件&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName 文件名称&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void removeFile(String bucketName, String objectName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minioClient.removeObject(&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RemoveObjectArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .build());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 批量删除文件&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param keys&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 需要删除的文件列表&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void removeFiles(String bucketName, List&amp;lt;String&amp;gt; keys) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;DeleteObject&amp;gt; objects = new LinkedList&amp;lt;&amp;gt;();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keys.forEach(s -&amp;gt; {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objects.add(new DeleteObject(s));&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; removeFile(bucketName, s);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.error(&amp;quot;[Minio工具类]&amp;gt;&amp;gt;&amp;gt;&amp;gt; 批量删除文件，异常：&amp;quot;, e);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获取文件外链&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName 存储桶&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName 文件名&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param expires&amp;nbsp;&amp;nbsp;&amp;nbsp; 过期时间 &amp;lt;=7 秒 （外链有效时间（单位：秒））&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return url&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().expiry(expires).bucket(bucketName).object(objectName).build();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.getPresignedObjectUrl(args);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获得文件外链&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param bucketName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param objectName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return url&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @SneakyThrows(Exception.class)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getPresignedObjectUrl(String bucketName, String objectName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bucket(bucketName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .object(objectName)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .method(Method.GET).build();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioClient.getPresignedObjectUrl(args);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 将URLDecoder编码转成UTF8&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param str&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @throws UnsupportedEncodingException&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getUtf8ByURLDecoder(String str) throws UnsupportedEncodingException {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String url = str.replaceAll(&amp;quot;%(?![0-9a-fA-F]{2})&amp;quot;, &amp;quot;%25&amp;quot;);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return URLDecoder.decode(url, &amp;quot;UTF-8&amp;quot;);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; &lt;br/&gt;&lt;br/&gt;5.5、创建Controller&lt;br/&gt;&lt;br/&gt;/**&lt;br/&gt;&amp;nbsp;* @author HAOYANG&lt;br/&gt;&amp;nbsp;* @create 2023-12-01 20:38&lt;br/&gt;&amp;nbsp;*/&lt;br/&gt;@Slf4j&lt;br/&gt;@RestController&lt;br/&gt;@RequestMapping(&amp;quot;/oss&amp;quot;)&lt;br/&gt;public class OSSController {&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Autowired&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private MinioUtils minioUtils;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Autowired&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private MinioConfig minioConfig;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 文件上传&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param file&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @PostMapping(&amp;quot;/upload&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String upload(@RequestParam(&amp;quot;file&amp;quot;) MultipartFile file) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //文件名&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String fileName = file.getOriginalFilename();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String newFileName = System.currentTimeMillis() + &amp;quot;.&amp;quot; + StringUtils.substringAfterLast(fileName, &amp;quot;.&amp;quot;);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //类型&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String contentType = file.getContentType();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minioUtils.uploadFile(minioConfig.getBucketName(), file, newFileName, contentType);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return &amp;quot;上传成功&amp;quot;;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.error(&amp;quot;上传失败&amp;quot;);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return &amp;quot;上传失败&amp;quot;;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 删除&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param fileName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @DeleteMapping(&amp;quot;/&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void delete(@RequestParam(&amp;quot;fileName&amp;quot;) String fileName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minioUtils.removeFile(minioConfig.getBucketName(), fileName);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获取文件信息&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param fileName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @GetMapping(&amp;quot;/info&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getFileStatusInfo(@RequestParam(&amp;quot;fileName&amp;quot;) String fileName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioUtils.getFileStatusInfo(minioConfig.getBucketName(), fileName);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 获取文件外链&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param fileName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @GetMapping(&amp;quot;/url&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getPresignedObjectUrl(@RequestParam(&amp;quot;fileName&amp;quot;) String fileName) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return minioUtils.getPresignedObjectUrl(minioConfig.getBucketName(), fileName);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 文件下载&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param fileName&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param response&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @GetMapping(&amp;quot;/download&amp;quot;)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void download(@RequestParam(&amp;quot;fileName&amp;quot;) String fileName, HttpServletResponse response) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream fileInputStream = minioUtils.getObject(minioConfig.getBucketName(), fileName);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.setHeader(&amp;quot;Content-Disposition&amp;quot;, &amp;quot;attachment;filename=&amp;quot; + fileName);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.setContentType(&amp;quot;application/force-download&amp;quot;);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.setCharacterEncoding(&amp;quot;UTF-8&amp;quot;);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IOUtils.copy(fileInputStream, response.getOutputStream());&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.error(&amp;quot;下载失败&amp;quot;);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br/&gt;&lt;br/&gt;6、测试验证&lt;br/&gt;6.1、文件上传&lt;br/&gt;&lt;br/&gt;使用Postman调用http://localhost:3333/oss/upload 接口，选择某个文件测试上传功能，如下图所示：&lt;br/&gt;&lt;br/&gt;image-20231201213316663&lt;br/&gt;6.2、文件下载&lt;br/&gt;&lt;br/&gt;在浏览器中，调用http://localhost:3333/oss/download?fileName=1701436432918.gif 接口，验证文件下载接口，如下图所示：&lt;br/&gt;&lt;br/&gt;image-20231201213607507&lt;br/&gt;原文链接：https://blog.csdn.net/qq_54673740/article/details/134731886&lt;/p&gt;</description><pubDate>Mon, 22 Jan 2024 13:59:35 +0800</pubDate></item><item><title>常见deepLink</title><link>http://blogcenter.cn/?id=251</link><description>&lt;p&gt;快手的 deepLink&lt;br/&gt;&lt;/p&gt;&lt;p&gt;https://blog.csdn.net/weixin_48141487/article/details/120616165&lt;/p&gt;&lt;p&gt;例子(部分参数可省略)&lt;br/&gt;&amp;nbsp;&lt;br/&gt;//账号与安全&lt;br/&gt;kwai://accountsecurity/&lt;br/&gt;//快动漫-推荐&lt;br/&gt;kwai://acg/home/&lt;br/&gt;//熟人圈&lt;br/&gt;kwai://acquaintance/&lt;br/&gt;//小程序-列表&lt;br/&gt;kwai://applet/home/&lt;br/&gt;//屏蔽关键词&lt;br/&gt;kwai://blockkeyword/&lt;br/&gt;//大屏模式设置&lt;br/&gt;kwai://browsesetting/ &lt;br/&gt;//定位界面&lt;br/&gt;kwai://business/location/ &lt;br/&gt;//地理位置&lt;br/&gt;kwai://business/poi/ &lt;br/&gt;//发私信-选择用户&lt;br/&gt;kwai://chat/select/sendmsg/ &lt;br/&gt;//陌生人消息&lt;br/&gt;kwai://chat/strangers/&lt;br/&gt;//青少年模式设置&lt;br/&gt;kwai://childlockguide/&lt;br/&gt;//未成年保护工具&lt;br/&gt;kwai://childprotect/&lt;br/&gt;//清除缓存&lt;br/&gt;kwai://cleancachemiddle/&lt;br/&gt;//清理垃圾&lt;br/&gt;kwai://cleaner/ &lt;br/&gt;//通讯录&lt;br/&gt;kwai://contacts/&lt;br/&gt;//发现好友&lt;br/&gt;kwai://explorefriend/&lt;br/&gt;//新增粉丝&lt;br/&gt;kwai://fans/&lt;br/&gt;//粉丝列表1 单粉丝&lt;br/&gt;kwai://followers/&lt;br/&gt;//粉丝列表2 带关注&lt;br/&gt;kwai://followings/&lt;br/&gt;//游戏中心&lt;br/&gt;kwai://gamecenter/&lt;br/&gt;//主页&lt;br/&gt;kwai://home/&lt;br/&gt;//首页关注&lt;br/&gt;kwai://home/following/&lt;br/&gt;//首页发现&lt;br/&gt;kwai://home/hot/&lt;br/&gt;//首页同城&lt;br/&gt;kwai://home/local/&lt;br/&gt;//共同关注&lt;br/&gt;kwai://immessage/commonFollowing/&lt;br/&gt;//直播&lt;br/&gt;kwai://live/play/[LiveStreamId]/&lt;br/&gt;//随机打开一个直播&lt;br/&gt;kwai://liveaggregatesquare/&lt;br/&gt;//聊天室&lt;br/&gt;kwai://livechatroomrecommend/&lt;br/&gt;//大家都在看&lt;br/&gt;kwai://livefeedsquare/&lt;br/&gt;//关注人 直播情况&lt;br/&gt;kwai://livemyfollow/&lt;br/&gt;//常看的主播&lt;br/&gt;kwai://liveoftenwatch/&lt;br/&gt;//草稿箱&lt;br/&gt;kwai://localalbum/&lt;br/&gt;//时光影集&lt;br/&gt;kwai://localsmartalbumlist/&lt;br/&gt;//快手小店&lt;br/&gt;kwai://merchanthome/&lt;br/&gt;//快手小店&lt;br/&gt;kwai://merchanthome2/&lt;br/&gt;//私信列表&lt;br/&gt;kwai://messages/&lt;br/&gt;//音悦台&lt;br/&gt;kwai://musicstation/&lt;br/&gt;//我的个人页面&lt;br/&gt;kwai://myprofile/&lt;br/&gt;//我的钱包&lt;br/&gt;kwai://mywallet/&lt;br/&gt;//动态列表&lt;br/&gt;kwai://news/&lt;br/&gt;//消息列表&lt;br/&gt;kwai://notifications/&lt;br/&gt;//拍摄&lt;br/&gt;kwai://post/&lt;br/&gt;//反馈&lt;br/&gt;kwai://postfeedback/&lt;br/&gt;//我&lt;br/&gt;kwai://profile/&lt;br/&gt;//用户页&lt;br/&gt;kwai://profile/user_id/&lt;br/&gt;//编辑资料&lt;br/&gt;kwai://profilesetting/&lt;br/&gt;//首页发现&lt;br/&gt;kwai://promotion/&lt;br/&gt;//二维码扫描&lt;br/&gt;kwai://qrscan/&lt;br/&gt;//搜索&lt;br/&gt;kwai://search?keyword=&lt;br/&gt;//搜索音乐&lt;br/&gt;kwai://search?music=&lt;br/&gt;//话题热榜&lt;br/&gt;kwai://search/topicRank/&lt;br/&gt;//搜索用户&lt;br/&gt;kwai://search?users=&lt;br/&gt;//关于我们&lt;br/&gt;kwai://setting/aboutus/&lt;br/&gt;//屏蔽设置&lt;br/&gt;kwai://setting/block/&lt;br/&gt;//通用设置&lt;br/&gt;kwai://setting/general/&lt;br/&gt;//直播设置&lt;br/&gt;kwai://setting/live/&lt;br/&gt;//谁可以私信我&lt;br/&gt;kwai://setting/messagePrivacy/&lt;br/&gt;//隐私设置&lt;br/&gt;kwai://setting/privacy/&lt;br/&gt;//通知设置&lt;br/&gt;kwai://setting/push/ &lt;br/&gt;//设置&lt;br/&gt;kwai://settings/&lt;br/&gt;//话题相关 标签&lt;br/&gt;kwai://tag/topic/keyword/&lt;br/&gt;//快手Q音热歌榜&lt;br/&gt;kwai://topmusic/&lt;br/&gt;//小剧场&lt;br/&gt;kwai://tube/&lt;br/&gt;//小剧场精选&lt;br/&gt;kwai://tube_series/ &lt;br/&gt;//作品页&lt;br/&gt;kwai://work/id/&lt;br/&gt;//图片作品&lt;br/&gt;kwai://work/[PhotoId]?userId=[UserId]&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;//以下是snssdk1128开头前缀的地址&lt;br/&gt;//打开视频：&lt;br/&gt;snssdk1128://aweme/detail/6683443624597916941?refer=web&amp;amp;gd_label=click_wap_profile_feature&amp;amp;appParam=&amp;amp;needlaunchlog=1&lt;br/&gt;//原声（同一个音乐的作品）：&lt;br/&gt;snssdk1128://music/detail/6680045787365247747?refer=web &lt;br/&gt;//热搜榜：&lt;br/&gt;snssdk1128://search/trending&lt;br/&gt;//最热视频:&lt;br/&gt;snssdk1128://search/trending?type=1 &lt;br/&gt;//音乐榜:&lt;br/&gt;snssdk1128://search/trending?type=2 &lt;br/&gt;//热搜（正能量）:&lt;br/&gt;snssdk1128://search/trending?type=3&lt;br/&gt;//明星爱豆榜:&lt;br/&gt;snssdk1128://search/trending?type=4&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;原文链接：&lt;br/&gt;&lt;/p&gt;&lt;p&gt;https://blog.csdn.net/qq_43306376/article/details/108361386&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;kwai://gamezone/home&amp;nbsp;&amp;nbsp; &amp;nbsp;打开游戏专区&lt;br/&gt;kwai://gamezone/game/[游戏ID]&amp;nbsp;&amp;nbsp; &amp;nbsp;打开某个游戏&lt;br/&gt;kwai://webview?url=[URL链接]&amp;nbsp;&amp;nbsp; &amp;nbsp;在快手中打开指定URL&lt;br/&gt;kwai://tag/topic/哒视眼镜&amp;nbsp;&amp;nbsp; &amp;nbsp;不知道什么玩意&lt;br/&gt;kwai://home/following&amp;nbsp;&amp;nbsp; &amp;nbsp;打开关注&lt;br/&gt;kwai://home/hot&amp;nbsp;&amp;nbsp; &amp;nbsp;打开发现&amp;nbsp; kwai://promotion&lt;br/&gt;kwai://home/local&amp;nbsp;&amp;nbsp; &amp;nbsp;打开同城&lt;br/&gt;kwai://profile/[用户UID]&amp;nbsp;&amp;nbsp; &amp;nbsp;打开用户主页&lt;br/&gt;kwai://profilesetting&amp;nbsp;&amp;nbsp; &amp;nbsp;编辑个人资料&lt;br/&gt;kwai://business/poi&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;地理位置&lt;br/&gt;kwai://business/location&amp;nbsp;&amp;nbsp; &amp;nbsp;定位界面&lt;br/&gt;kwai://work/[作品ID]&amp;nbsp;&amp;nbsp; &amp;nbsp;打开某作品&lt;br/&gt;kwai://work/[PhotoId]?userId=[UserId]&lt;br/&gt;kwai://live/play/[LiveStreamId]&amp;nbsp;&amp;nbsp; &amp;nbsp;上面两个应该是 图片作品&amp;nbsp; 这个是小视频作品&lt;br/&gt;kwai://liveaggregate?sourceType=[不知道什么参数]&lt;br/&gt;kwai://liveaggregate/[未知参数]?sourceType=[未知参数]&lt;br/&gt;kwai://musicstation/[PhotoId]?userId=[UserId]&amp;amp;sourceType=[Integer.valueOf(13)]&lt;br/&gt;kwai://musicstation&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;快手音悦台&lt;br/&gt;kwai://followers&amp;nbsp;&amp;nbsp; &amp;nbsp;粉丝列表&lt;br/&gt;kwai://followings&amp;nbsp;&amp;nbsp; &amp;nbsp;关注列表&lt;br/&gt;kwai://tube/square&amp;nbsp;&amp;nbsp; &amp;nbsp;小剧场 &lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;抖音：&lt;br/&gt;&lt;/p&gt;&lt;p&gt;snssdk1128://feed?refer=web&amp;amp;gd_label={{gd_label}}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 回首页&lt;br/&gt;snssdk1128://live?room_id=&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 直播间&lt;br/&gt;snssdk1128://user/profile/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用户&lt;br/&gt;home: &amp;quot;snssdk1128://feed?refer=web&amp;amp;gd_label={{gd_label}}&amp;quot;,&lt;br/&gt;detail: &amp;quot;snssdk1128://aweme/detail/{{id}}?refer=web&amp;amp;gd_label={{gd_label}}&amp;amp;appParam={{appParam}}&amp;amp;needlaunchlog=1&amp;quot;,&lt;br/&gt;user: &amp;quot;snssdk1128://user/profile/{{uid}}?refer=web&amp;amp;gd_label={{gd_label}}&amp;amp;type={{type}}&amp;amp;needlaunchlog=1&amp;quot;,&lt;br/&gt;challenge: &amp;quot;snssdk1128://challenge/detail/{{id}}?refer=web&amp;quot;,&lt;br/&gt;music: &amp;quot;snssdk1128://music/detail/{{id}}?refer=web&amp;quot;,&lt;br/&gt;live: &amp;quot;snssdk1128://live?room_id={{room_id}}&amp;amp;user_id={{user_id}}&amp;amp;from=webview&amp;amp;refer=web&amp;quot;,&lt;br/&gt;webview: &amp;quot;snssdk1128://webview?url={{url}}&amp;amp;from=webview&amp;amp;refer=web&amp;quot;,&lt;br/&gt;webview_fullscreen: &amp;quot;snssdk1128://webview?url={{url}}&amp;amp;from=webview&amp;amp;hide_nav_bar=1&amp;amp;refer=web&amp;quot;,&lt;br/&gt;poidetail: &amp;quot;snssdk1128://poi/detail?id={{id}}&amp;amp;from=webview&amp;amp;refer=web&amp;quot;,&lt;br/&gt;forward: &amp;quot;snssdk1128://forward/detail/{{id}}&amp;quot;,&lt;br/&gt;billboard_word: &amp;quot;snssdk1128://search/trending&amp;quot;,&lt;br/&gt;billboard_video: &amp;quot;snssdk1128://search/trending?type=1&amp;quot;,&lt;br/&gt;billboard_music: &amp;quot;snssdk1128://search/trending?type=2&amp;quot;,&lt;br/&gt;billboard_positive: &amp;quot;snssdk1128://search/trending?type=3&amp;quot;,&lt;br/&gt;billboard_star: &amp;quot;snssdk1128://search/trending?type=4&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;微信：&lt;/p&gt;&lt;p&gt;weixin://dl/scan 扫一扫&lt;br/&gt;weixin://dl/feedback 反馈&lt;br/&gt;weixin://dl/moments 朋友圈&lt;br/&gt;weixin://dl/settings 设置&lt;br/&gt;weixin://dl/notifications 消息通知设置&lt;br/&gt;weixin://dl/chat 聊天设置&lt;br/&gt;weixin://dl/general 通用设置&lt;br/&gt;weixin://dl/officialaccounts 公众号&lt;br/&gt;weixin://dl/games 游戏&lt;br/&gt;weixin://dl/help 帮助&lt;br/&gt;weixin://dl/feedback 反馈&lt;br/&gt;weixin://dl/profile 个人信息&lt;br/&gt;weixin://dl/features 功能插件&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 12 Jan 2024 15:08:17 +0800</pubDate></item><item><title>全网最全deeplink(url scheme)</title><link>http://blogcenter.cn/?id=250</link><description>&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;抖音作品页面 snssdk1128://aweme/detail/6850749343767596296&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 快手作品页面 kwai://work/5221923782104138503 &amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 快手用户页面 kwai://profile/1162429530&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 火山作品页面 snssdk1112://item?id=6622594672759934222&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 皮皮虾作品页面&amp;nbsp; bds://cell_detail?item_id=6863284805753116939&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 微视用户主页 weishi://profile?person_id=1531362765912773 &lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 微视作品页面&amp;nbsp; weishi://feed?feed_id=70Qv0YDc11K6Y1s4v &lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 西瓜作品页面&amp;nbsp; snssdk32://detail?groupid=6831736164282532356&lt;br/&gt;————————————————&lt;br/&gt;&lt;/p&gt;&lt;p&gt;淘宝&lt;br/&gt;领金币 https://market.m.taobao.com/app/tmall-wireless/tjb-2018/index/index.html?utparam={&amp;quot;ranger_buckets_native&amp;quot;:&amp;quot;tsp2189_21618&amp;quot;}&amp;amp;spm=a2141.1.iconsv5.8&amp;amp;scm=1007.home_icon.lingjb.d&amp;amp;disableNav=YES#/tjb&lt;br/&gt;领红包 taobao://market.m.taobao.com/app/tmall-def/daily-welfare/pages/index?wh_weex=true&lt;br/&gt;饿了么小程序&lt;br/&gt;饿了么红包 https://m.tb.cn/h.4UBXrn6&lt;br/&gt;小程序APPID&lt;br/&gt;&lt;br/&gt;wxece3a9a4c82f58c9&lt;br/&gt;小程序路径&lt;br/&gt;&lt;br/&gt;taoke/pages/shopping-guide/index?scene=XLSZNtu&lt;br/&gt;美团&lt;br/&gt;美团都能领的红包&lt;br/&gt;&lt;br/&gt;http://dpurl.cn/U3urUlT&lt;br/&gt;美团外卖&lt;br/&gt;&lt;br/&gt;imeituan://www.meituan.com/web&lt;br/&gt;http://dpurl.cn/8ob8jKo&lt;br/&gt;京东&lt;br/&gt;领京豆 openApp.jdMobile://virtual?params={&amp;quot;category&amp;quot;:&amp;quot;jump&amp;quot;,&amp;quot;modulename&amp;quot;:&amp;quot;JDReactCollectJDBeans&amp;quot;,&amp;quot;des&amp;quot;:&amp;quot;jdreactcommon&amp;quot;,&amp;quot;param&amp;quot;:{&amp;quot;page&amp;quot;:&amp;quot;collectJDBeansHomePage&amp;quot;}}&lt;br/&gt;拼多多&lt;br/&gt;签到 pinduoduo://com.xunmeng.pinduoduo/https://mobile.yangkeduo.com/pythagoras_ctc_ca.html&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020-10-16更新&lt;br/&gt;&lt;br/&gt;聊天/社交类&lt;br/&gt;QQ&lt;br/&gt;主页&lt;br/&gt;&lt;br/&gt;packageName: &amp;#39;com.tencent.mobileqq&amp;#39;, &amp;nbsp;&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;mqq://&amp;#39; &lt;br/&gt;&lt;br/&gt;国际版qq mqqiapi://&lt;br/&gt;加好友&lt;br/&gt;&lt;br/&gt;mqqapi://card/show_pslcard?src_type=internal&amp;amp;version=1&amp;amp;uin={QQ号}&lt;br/&gt;&lt;br/&gt;打开QQ群&lt;br/&gt;&lt;br/&gt;mqqapi://card/show_pslcard?src_type=internal&amp;amp;version=1&amp;amp;card_type=group&amp;amp;uin={QQ群号}&lt;br/&gt;&lt;br/&gt;TIM&lt;br/&gt;主页 tim://&lt;br/&gt;扫一扫 tim://qrcode/scan_qrcode?version=1&amp;amp;src_type=app&lt;br/&gt;微信&lt;br/&gt;&lt;br/&gt;packageName: &amp;#39;com.tencent.mm&amp;#39;,&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;weixin://&amp;#39;&lt;br/&gt;&lt;br/&gt;天涯社区 tianya://&lt;br/&gt;微信扫一扫 weixin://scanqrcode&lt;br/&gt;企业微信 wxwork://&lt;br/&gt;钉钉 dingtalk://&lt;br/&gt;探探 tantanapp://&lt;br/&gt;陌陌 momochat://&lt;br/&gt;墨客 com.moke.moke://&lt;br/&gt;Line line://&lt;br/&gt;飞信 fetion://&lt;br/&gt;旺旺卖家版 wangwangseller://&lt;br/&gt;新闻/知识类&lt;br/&gt;今日头条 snssdk141://&lt;br/&gt;知乎&lt;br/&gt;主页 zhihu://&lt;br/&gt;知乎扫一扫 zhihu://codereader&lt;br/&gt;新浪微博&lt;br/&gt;&lt;br/&gt;packageName: &amp;#39;com.sina.weibo&amp;#39;, &amp;nbsp;&lt;br/&gt;scheme: &amp;#39;sinaweibo:// 或 weibo://`&lt;br/&gt;&lt;br/&gt;新浪微博国际版 weibointernational://&lt;br/&gt;weico微博 weico://&lt;br/&gt;网易新闻 newsapp://&lt;br/&gt;人人 renren:// 或者 renrenios://&lt;br/&gt;凤凰新闻 comIfeng3GifengNews://&lt;br/&gt;腾讯新闻 qqnews://&lt;br/&gt;搜狐新闻 sohunews://&lt;br/&gt;芝士超人 trivia://&lt;br/&gt;外卖&lt;br/&gt;美团 imeituan://&lt;br/&gt;美团外卖 meituanwaimai://&lt;br/&gt;点评 dianping://&lt;br/&gt;地图&lt;br/&gt;高德地图&lt;br/&gt;主页 iosamap://&lt;br/&gt;驾驶导航 iosamap://navi?sourceApplication=applicationName&amp;amp;backScheme=applicationScheme&amp;amp;poiname=fangheng&amp;amp;poiid=BGVIS&amp;amp;lat=36.547901&amp;amp;lon=104.258354&amp;amp;dev=1&amp;amp;style=2&lt;br/&gt;邮件&lt;br/&gt;Gmail googlegmail://&lt;br/&gt;网易邮箱 neteasemail://&lt;br/&gt;QQ邮箱 qqmail://&lt;br/&gt;腾讯企业邮箱 qqbizmailDistribute2://&lt;br/&gt;生活/工具类&lt;br/&gt;摩拜单车 mobike://&lt;br/&gt;支付宝&lt;br/&gt;首页&lt;br/&gt;&lt;br/&gt;packageName: &amp;#39;com.eg.android.AlipayGphone&amp;#39;,&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;alipay://&amp;#39;&lt;br/&gt;&lt;br/&gt;扫一扫 alipayqr://platformapi/startapp?saId=10000007&lt;br/&gt;乘车码 alipayqr://platformapi/startapp?saId=200011235&lt;br/&gt;收款 alipays://platformapi/startapp?appId=20000123&lt;br/&gt;付款码 alipayqr://platformapi/startapp?saId=20000056&lt;br/&gt;收款码 alipayqr://platformapi/startapp?saId=20000123&lt;br/&gt;转账 alipayqr://platformapi/startapp?saId=20000116&lt;br/&gt;提现 alipayqr://platformapi/startapp?saId=20000033&lt;br/&gt;花呗 alipays://platformapi/startapp?appId=20000199&lt;br/&gt;借呗 alipays://platformapi/startapp?appId=20000180&lt;br/&gt;还信用卡 alipays://platformapi/startapp?appId=09999999&lt;br/&gt;蚂蚁森林 alipay://platformapi/startapp?appId=60000002&lt;br/&gt;蚂蚁庄园 alipays://platformapi/startapp?appId=66666674&lt;br/&gt;运动 alipayqr://platformapi/startapp?saId=20000869&lt;br/&gt;卡劵 alipayqr://platformapi/startapp?saId=88888888&lt;br/&gt;彩票 alipays://platformapi/startapp?appId=10000011&lt;br/&gt;股票 alipays://platformapi/startapp?appId=20000134&lt;br/&gt;生活缴费 alipays://platformapi/startapp?appId=20000193&lt;br/&gt;手机充值 alipayqr://platformapi/startapp?saId=10000003&lt;br/&gt;生活圈 alipays://platformapi/startapp?appId=20000943&lt;br/&gt;记账本 alipay://platformapi/startapp?appId=20000168&lt;br/&gt;滴滴 alipay://platformapi/startapp?appId=20000778&lt;br/&gt;快递查询 alipays://platformapi/startapp?appId=20000754&lt;br/&gt;还信用卡 alipays://platformapi/startapp?appId=09999999&lt;br/&gt;会员积分 alipays://platformapi/startapp?appId=20000160&lt;br/&gt;滴滴出行 diditaxi://&lt;br/&gt;米家 mihome://&lt;br/&gt;58同城 wbmain://&lt;br/&gt;格志 griddiary://&lt;br/&gt;搜狗输入法 com.sogou.sogouinput://&lt;br/&gt;百度输入法 BaiduIMShop://&lt;br/&gt;有道云笔记 youdaonote://&lt;br/&gt;印象笔记 evernote://&lt;br/&gt;随手记 FDMoney://&lt;br/&gt;1Password onepassword://&lt;br/&gt;Gmail googlegmail://&lt;br/&gt;百度&lt;br/&gt;手机百度 bdboxiosqrcode://&lt;br/&gt;百度文库hd bdwenku://&lt;br/&gt;百度云盘 baiduyun://&lt;br/&gt;百度贴吧 com.baidu.tieba://&lt;br/&gt;百度音乐 baidumusic://&lt;br/&gt;百度视频 baiduvideoiphone:// 或 bdviphapp://&lt;br/&gt;百度糯米 bainuo://&lt;br/&gt;百度魔图 photowonder://&lt;br/&gt;百度魔拍 wondercamera://&lt;br/&gt;百度地图 baidumap://&lt;br/&gt;百度导航 bdNavi://&lt;br/&gt;百度阅读 bdbook://&lt;br/&gt;360搜索 msearchapp://&lt;br/&gt;搜狗搜索 sogousearch://&lt;br/&gt;Keep运动 keep://&lt;br/&gt;小米运动 fb370547106731052://&lt;br/&gt;NOMO相机 nomocamera://&lt;br/&gt;中国移动掌上营业厅 wxbcb43ea5d2d6384c://&lt;br/&gt;12306 cn.12306://&lt;br/&gt;12306订票助手 trainassist://&lt;br/&gt;高铁管家 gtgj://&lt;br/&gt;腾讯手机管家 mqqsecure://&lt;br/&gt;JSBox&lt;br/&gt;打开JSBox&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;jsbox://&amp;#39;&lt;br/&gt;&lt;br/&gt;执行JSBox脚本&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;jsbox://run?name={编码后的脚本名}&amp;#39;&lt;br/&gt;&lt;br/&gt;拍照取字 paizhaoquzi://first&lt;br/&gt;iCab Mobile x-icabmobile://&lt;br/&gt;圈子账本 qzzb://&lt;br/&gt;挖财记账 wacai://&lt;br/&gt;彩云小译 mlink://&lt;br/&gt;名片全能王 camcard://&lt;br/&gt;微盘 sinavdisk://&lt;br/&gt;我查查 wcc://&lt;br/&gt;Clear(著名的Todo应用) clearapp://&lt;br/&gt;Calendars 5 calendars://&lt;br/&gt;GoodReader 4 com.goodreader.sendtogr://&lt;br/&gt;PDF Expert 5 pdfexpert5presence://&lt;br/&gt;Documents 5 rdocs://&lt;br/&gt;365日历 rili365://&lt;br/&gt;天气通Pro sinaweatherpro://&lt;br/&gt;天气通 sinaweather://&lt;br/&gt;墨迹天气 rm434209233MojiWeather://&lt;br/&gt;腾讯微云 weiyun://&lt;br/&gt;腾讯地图 sosomap://&lt;br/&gt;淘宝旅行 taobaotravel://&lt;br/&gt;股票/金融类&lt;br/&gt;同花顺 amihexin://&lt;br/&gt;大智慧 dzhiphone://&lt;br/&gt;京东金融&lt;br/&gt;签到/双签 jdmobile://share?jumpType=7&amp;amp;jumpUrl=1373&lt;br/&gt;&lt;br/&gt;https://xydida.com/2020/10/1/notes/APP-URL-Scheme/&lt;br/&gt;浏览器类&lt;br/&gt;Safari浏览器 x-web-search://&lt;br/&gt;Alook浏览器 Alook://&lt;br/&gt;无相浏览器 wuxiang://&lt;br/&gt;夸克浏览器 quark://&lt;br/&gt;UC浏览器 ucbrowser://&lt;br/&gt;QQ浏览器 mttbrowser://&lt;br/&gt;Chrome浏览器 googlechrome://&lt;br/&gt;购物类&lt;br/&gt;淘宝&lt;br/&gt;&lt;br/&gt;packageName: &amp;#39;com.taobao.taobao&amp;#39;, &amp;nbsp;&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;taobao://&amp;#39; &lt;br/&gt;&lt;br/&gt;淘宝搜索 taobao://s.taobao.com?q=[输入]&lt;br/&gt;天猫 tmall://&lt;br/&gt;京东&lt;br/&gt;主页&lt;br/&gt;&lt;br/&gt;packageName: &amp;#39;com.jingdong.app.mall&amp;#39;, &amp;nbsp;&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;openApp.jdMobile://&amp;#39; &lt;br/&gt;&lt;br/&gt;签到 openApp.jdMobile://virtual?params={&amp;quot;category&amp;quot;:&amp;quot;jump&amp;quot;,&amp;quot;modulename&amp;quot;:&amp;quot;JDReactCollectJDBeans&amp;quot;,&amp;quot;des&amp;quot;:&amp;quot;jdreactcommon&amp;quot;,&amp;quot;param&amp;quot;:{&amp;quot;page&amp;quot;:&amp;quot;collectJDBeansHomePage&amp;quot;;}}&lt;br/&gt;苏宁 suning://&lt;br/&gt;拼多多 pinduoduo://&lt;br/&gt;1号店 yihaodian://&lt;br/&gt;菜鸟裹裹 cainiao://&lt;br/&gt;Price Tag&lt;br/&gt;打开 pricetag://&lt;br/&gt;发现 pricetag://explore&lt;br/&gt;收藏 pricetag://favorites&lt;br/&gt;降价 pricetag://pricedrop&lt;br/&gt;影视类&lt;br/&gt;B站&lt;br/&gt;主页 bilibili://&lt;br/&gt;搜索 bilibili://search?keyword={关键词}&lt;br/&gt;&lt;br/&gt;packageName: &amp;#39;com.youku.phone&amp;#39;, &amp;nbsp;&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;youku://&amp;#39; &lt;br/&gt;&lt;br/&gt;PPTV pptv://&lt;br/&gt;爱奇艺视频 qiyi-iphone://&lt;br/&gt;爱奇艺PPS ppstream://&lt;br/&gt;暴风影音 com.baofeng.play://&lt;br/&gt;土豆视频 tudou://&lt;br/&gt;搜狐视频 sohuvideo-iphone:// 或 sohuvideo://&lt;br/&gt;抖音 awemesso://&lt;br/&gt;腾讯视频 tenvideo:// 或 tenvideo2:// 或 tenvideo3://&lt;br/&gt;56视频 com.56Video://&lt;br/&gt;YY直播 yymobile://&lt;br/&gt;一直播 xk://&lt;br/&gt;花椒直播 huajiao://&lt;br/&gt;nPlayer nplayer-http://&lt;br/&gt;GPlayer gplayer://&lt;br/&gt;AVPlayer HD AVPlayerHD://&lt;br/&gt;AVPlayer AVPlayer://&lt;br/&gt;Ace Player aceplayer://&lt;br/&gt;音乐类&lt;br/&gt;虾米音乐&lt;br/&gt;搜索 xiami://search&lt;br/&gt;私人电台 xiami://radio/private&lt;br/&gt;每日30首 欢迎关注gzh“正义的程序猿” xiami://playdailysong&lt;br/&gt;虾米猜 xiami://radio/guess&lt;br/&gt;本地音乐 xiami://playLocalMusic&lt;br/&gt;听歌识曲&lt;br/&gt;&lt;br/&gt;scheme: &amp;#39;xiami://soundhound&amp;#39;&lt;br/&gt;&lt;br/&gt;或者： &amp;#39;xiami://musicRecognize&amp;#39;&lt;br/&gt;&lt;br/&gt;酷我音乐 com.kuwo.kwmusic.kwmusicForKwsing://&lt;br/&gt;豆瓣 FM doubanradio://&lt;br/&gt;蜻蜓FM qtfmp://&lt;br/&gt;酷狗音乐 kugouURL://&lt;br/&gt;百度音乐 baidumusic://&lt;br/&gt;天天动听 ttpod://&lt;br/&gt;网易云音乐&lt;br/&gt;打开应用 orpheuswidget://&lt;br/&gt;私人FM orpheuswidget://radio&lt;br/&gt;本地音乐 orpheuswidget://download&lt;br/&gt;听歌识曲 orpheuswidget://recognize&lt;br/&gt;歌单 orpheuswidget://playlist/id&lt;br/&gt;用户页 orpheuswidget://user/userid&lt;br/&gt;播放音乐 orpheuswidget://song/songid&lt;br/&gt;热搜榜 orpheus://playlist/3778678&lt;br/&gt;飙升榜 orpheus://playlist/19723756&lt;br/&gt;新歌榜 orpheus://playlist/3779629&lt;br/&gt;QQ音乐&lt;br/&gt;喜欢 qqmusic://qq.com/ui/myTab?p=%7B%22tab%22%3A%22fav%22%7D&lt;br/&gt;本地音乐 qqmusic://today?mid=31&amp;amp;k1=3&amp;amp;k4=0&lt;br/&gt;最近播放 qqmusic://today?mid=31&amp;amp;k1=2&amp;amp;k4=0&lt;br/&gt;个性电台 qqmusic://qq.com/media/playRadio?p=%7B%22radioId%22%3A%2299%22%7D&lt;br/&gt;听歌识曲 qqmusic://qq.com/ui/recognize&lt;br/&gt;继续播放 qqmusic://qq.com/media/resumeSong?p=%7B%7D&lt;br/&gt;学习类&lt;br/&gt;掌阅iReader iReader://&lt;br/&gt;沪江小D词典 hjdict://&lt;br/&gt;有道词典 yddict://&lt;br/&gt;网易公开课 ntesopen://&lt;br/&gt;金山词霸 com.kingsoft.powerword.6://&lt;br/&gt;布卡漫画 buka://&lt;br/&gt;拿铁阅读 LatteRead://&lt;br/&gt;银行类&lt;br/&gt;浦发银行 wx1cb534bb13ba3dbd://&lt;br/&gt;招商银行 cmbmobilebank://&lt;br/&gt;建设银行 wx2654d9155d70a468://&lt;br/&gt;工商银行 com.icbc.iphoneclient://&lt;br/&gt;办公&lt;br/&gt;WPS KingsoftOfficeApp://&lt;br/&gt;系统类&lt;br/&gt;备忘录 mobilenotes://&lt;br/&gt;workflow workflow://&lt;br/&gt;捷径 shortcuts://&lt;br/&gt;系统设置 app-prefs://&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我的iPhone 8 打不开这个，不知什么原因，系统是ios 13&lt;br/&gt;&lt;br/&gt;App Store itms-apps://&lt;br/&gt;iOS创建短信 sms://{手机号}&lt;br/&gt;电话 tel://&lt;br/&gt;&lt;br/&gt;https://xydida.com/2020/10/1/notes/APP-URL-Scheme/&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 给指定手机号发短信&lt;br/&gt;&lt;br/&gt;游戏类&lt;br/&gt;QQ斗地主 tencent382://&lt;br/&gt;永远的七日之都 neteaseqrzd://&lt;br/&gt;崩坏三 bh3rd://&lt;br/&gt;叨鱼APP sdguc://&lt;br/&gt;节奏大师 tencentrm://&lt;br/&gt;天天星连萌 tencent100689806://&lt;br/&gt;天天爱消除 tencent100689805://&lt;br/&gt;天天酷跑 tencent100692648://&lt;br/&gt;天天飞车 tencent100695850://&lt;br/&gt;应用商店类&lt;br/&gt;小米应用商店&lt;br/&gt;&lt;br/&gt;scheme: &amp;quot;mimarket://details?id=com.xx.xx&amp;quot;&lt;br/&gt;&lt;br/&gt;三星应用商店&lt;br/&gt;&lt;br/&gt;scheme: &amp;quot;samsungapps://ProductDetail/com.xx.xx&amp;quot;&lt;br/&gt;&lt;br/&gt;华为应用商店&lt;br/&gt;&lt;br/&gt;scheme: &amp;quot;appmarket://details?id=com.xx.xx&amp;quot;&lt;br/&gt;&lt;br/&gt;OPPO应用商店&lt;br/&gt;&lt;br/&gt;oppomarket:&amp;quot;//details?packagename=com.xx.xx&amp;quot;&lt;br/&gt;&lt;br/&gt;vivo应用商店&lt;br/&gt;&lt;br/&gt;scheme: &amp;quot;vivomarket://details?id=com.xx.xx&amp;quot;&lt;br/&gt;&lt;br/&gt;由于支付宝的URL Scheme很全面，这里再单独列一下，可能会和上面有重复：&lt;br/&gt;&lt;br/&gt;支付宝：&lt;br/&gt;alipay://&lt;br/&gt;收款:&lt;br/&gt;alipays://platformapi/startapp?appId=20000123&lt;br/&gt;扫码：&lt;br/&gt;alipays://platformapi/startapp?saId=10000007&lt;br/&gt;余额宝:&lt;br/&gt;alipays://platformapi/startapp?appId=20000032&lt;br/&gt;转账:&lt;br/&gt;alipays://platformapi/startapp?appId=20000221&lt;br/&gt;租房：&lt;br/&gt;alipays://platformapi/startapp?appId=60000125&lt;br/&gt;城市服务：&lt;br/&gt;alipays://platformapi/startapp?appId=20000178&lt;br/&gt;手机充值：&lt;br/&gt;alipays://platformapi/startapp?appId=10000003&lt;br/&gt;快递查询：&lt;br/&gt;alipays://platformapi/startapp?appId=20000754&lt;br/&gt;我的快递-寄件平台：&lt;br/&gt;alipays://platformapi/startapp?appId=60000146&lt;br/&gt;我的二维码:&lt;br/&gt;alipays://platformapi/startapp?appId=20000085&lt;br/&gt;蚂蚁庄园:&lt;br/&gt;alipays://platformapi/startapp?appId=66666674&lt;br/&gt;蚂蚁森林：&lt;br/&gt;alipays://platformapi/startapp?appId=60000002&lt;br/&gt;我的公益：&lt;br/&gt;alipays://platformapi/startapp?appId=66666867&lt;br/&gt;运动：&lt;br/&gt;alipays://platformapi/startapp?appId=20000869&lt;br/&gt;蚂蚁借呗：&lt;br/&gt;alipays://platformapi/startapp?appId=20000180&lt;br/&gt;个人主页：&lt;br/&gt;alipays://platformapi/startapp?appId=20000186&lt;br/&gt;个人名片:&lt;br/&gt;alipays://platformapi/startapp?appId=20000228&lt;br/&gt;信用卡还款：&lt;br/&gt;alipays://platformapi/startapp?appId=09999999&lt;br/&gt;爱心捐赠：&lt;br/&gt;alipays://platformapi/startapp?appId=10000009&lt;br/&gt;彩票：&lt;br/&gt;alipays://platformapi/startapp?appId=10000011&lt;br/&gt;转账：&lt;br/&gt;alipays://platformapi/startapp?appId=09999988&lt;br/&gt;花呗：&lt;br/&gt;alipays://platformapi/startapp?appId=20000199&lt;br/&gt;生活缴费：&lt;br/&gt;alipays://platformapi/startapp?appId=20000193&lt;br/&gt;芝麻信用:&lt;br/&gt;alipays://platformapi/startapp?appId=20000118&lt;br/&gt;位置:&lt;br/&gt;alipays://platformapi/startapp?appId=20000226&lt;br/&gt;卡券:&lt;br/&gt;alipays://platformapi/startapp?appId=20000227&lt;br/&gt;饿了么外卖:&lt;br/&gt;alipays://platformapi/startapp?appId=20000120&lt;br/&gt;淘票票电影:&lt;br/&gt;alipays://platformapi/startapp?appId=20000131&lt;br/&gt;火车票:&lt;br/&gt;alipays://platformapi/startapp?appId=20000143&lt;br/&gt;汇率换算:&lt;br/&gt;alipays://platformapi/startapp?appId=20000150&lt;br/&gt;理财小工具：&lt;br/&gt;alipays://platformapi/startapp?appId=20000161&lt;br/&gt;羊城通充值：&lt;br/&gt;alipays://platformapi/startapp?appId=20000162&lt;br/&gt;收货地址:&lt;br/&gt;alipays://platformapi/startapp?appId=20000714&lt;br/&gt;隐私：&lt;br/&gt;alipays://platformapi/startapp?appId=20000723&lt;br/&gt;通用：&lt;br/&gt;alipays://platformapi/startapp?appId=20000724&lt;br/&gt;充值中心：&lt;br/&gt;alipays://platformapi/startapp?appId=20000987&lt;br/&gt;校园一卡通：&lt;br/&gt;alipays://platformapi/startapp?appId=2013062600000474&lt;br/&gt;淘宝：&lt;br/&gt;alipays://platformapi/startapp?appId=2013082800000932&lt;br/&gt;教育缴费：&lt;br/&gt;alipays://platformapi/startapp?appId=2014021200003129&lt;br/&gt;ofo小黄车：&lt;br/&gt;alipays://platformapi/startapp?appId=2017041206668232&lt;br/&gt;高德打车：&lt;br/&gt;alipays://platformapi/startapp?appId=2018070960585195&lt;br/&gt;蚂蚁宝卡：&lt;br/&gt;alipays://platformapi/startapp?appId=60000057&lt;br/&gt;地铁购票：&lt;br/&gt;alipays://platformapi/startapp?appId=60000070&lt;br/&gt;AA收款：&lt;br/&gt;alipays://platformapi/startapp?appId=60000154&lt;br/&gt;AA收款:&lt;br/&gt;alipays://platformapi/startapp?appId=66666696&lt;br/&gt;AA收款：&lt;br/&gt;alipays://platformapi/startapp?appId=9000258&lt;br/&gt;共享单车：&lt;br/&gt;alipays://platformapi/startapp?appId=60000155&lt;br/&gt;余利宝:&lt;br/&gt;alipays://platformapi/startapp?appId=66666708&lt;br/&gt;收钱码服务:&lt;br/&gt;alipays://platformapi/startapp?appId=66666714&lt;br/&gt;大麦演出票：&lt;br/&gt;alipays://platformapi/startapp?appId=66666753&lt;br/&gt;口碑签到：&lt;br/&gt;alipays://platformapi/startapp?appId=66666776&lt;br/&gt;信用生活：&lt;br/&gt;alipays://platformapi/startapp?appId=66666786&lt;br/&gt;支付宝月账单：&lt;br/&gt;alipays://platformapi/startapp?appId=66666798&lt;br/&gt;天猫购物：&lt;br/&gt;alipays://platformapi/startapp?appId=66666820&lt;br/&gt;绿色城市：&lt;br/&gt;alipays://platformapi/startapp?appId=66666824&lt;br/&gt;还贷管家：&lt;br/&gt;alipays://platformapi/startapp?appId=66666819&lt;br/&gt;股票:&lt;br/&gt;alipays://platformapi/startapp?appId=20000134&lt;br/&gt;淘票票：&lt;br/&gt;alipays://platformapi/startapp?appId=68687093&lt;br/&gt;淘票票H5票券：&lt;br/&gt;alipays://platformapi/startapp?appId=68687095&lt;br/&gt;淘票票H5购票：&lt;br/&gt;alipays://platformapi/startapp?appId=68687096&lt;br/&gt;收款：&lt;br/&gt;alipays://platformapi/startapp?appId=20000674&lt;br/&gt;余额宝：&lt;br/&gt;alipays://platformapi/startapp?appId=60000126&lt;br/&gt;余额宝:&lt;br/&gt;alipays://platformapi/startapp?appId=77700124&lt;br/&gt;话费卡转让：&lt;br/&gt;alipays://platformapi/startapp?appId=10000033&lt;br/&gt;关于：&lt;br/&gt;alipays://platformapi/startapp?appId=10000110&lt;br/&gt;天猫：&lt;br/&gt;alipays://platformapi/startapp?appId=20000000&lt;br/&gt;账单：&lt;br/&gt;alipays://platformapi/startapp?appId=20000003&lt;br/&gt;银行卡:&lt;br/&gt;alipays://platformapi/startapp?appId=20000014&lt;br/&gt;账户详情:&lt;br/&gt;alipays://platformapi/startapp?appId=20000019&lt;br/&gt;支付设置:&lt;br/&gt;alipays://platformapi/startapp?appId=20000024&lt;br/&gt;实名认证:&lt;br/&gt;alipays://platformapi/startapp?appId=20000038&lt;br/&gt;反馈:&lt;br/&gt;alipays://platformapi/startapp?appId=20000049&lt;br/&gt;上银汇款:&lt;br/&gt;alipays://platformapi/startapp?appId=20000078&lt;br/&gt;生活号:&lt;br/&gt;alipays://platformapi/startapp?appId=20000101&lt;br/&gt;出境:&lt;br/&gt;alipays://platformapi/startapp?appId=20000107&lt;br/&gt;安全设置:&lt;br/&gt;alipays://platformapi/startapp?appId=20000113&lt;br/&gt;亲情号:&lt;br/&gt;alipays://platformapi/startapp?appId=20000132&lt;br/&gt;火车票机票:&lt;br/&gt;alipays://platformapi/startapp?appId=20000135&lt;br/&gt;飞猪酒店:&lt;br/&gt;alipays://platformapi/startapp?appId=20000139&lt;br/&gt;娱乐宝:&lt;br/&gt;alipays://platformapi/startapp?appId=20000142&lt;br/&gt;海外交通卡:&lt;br/&gt;alipays://platformapi/startapp?appId=20000152&lt;br/&gt;游戏中心：&lt;br/&gt;alipays://platformapi/startapp?appId=20000153&lt;br/&gt;国际机票：&lt;br/&gt;alipays://platformapi/startapp?appId=20000157&lt;br/&gt;蚂蚁会员：&lt;br/&gt;alipays://platformapi/startapp?appId=20000160&lt;br/&gt;定期：&lt;br/&gt;alipays://platformapi/startapp?appId=20000165&lt;br/&gt;记账本：&lt;br/&gt;alipays://platformapi/startapp?appId=20000168&lt;br/&gt;手势：&lt;br/&gt;alipays://platformapi/startapp?appId=20000184&lt;br/&gt;H5公共资源 欢迎关注gzh“正义的程序猿”：&lt;br/&gt;alipays://platformapi/startapp?appId=20000196&lt;br/&gt;H5运营活动资源包：&lt;br/&gt;alipays://platformapi/startapp?appId=20000202&lt;br/&gt;亲情圈:&lt;br/&gt;alipays://platformapi/startapp?appId=20000205&lt;br/&gt;黄金:&lt;br/&gt;alipays://platformapi/startapp?appId=20000218&lt;br/&gt;蚂蚁乐驾:&lt;br/&gt;alipays://platformapi/startapp?appId=20000241&lt;br/&gt;总资产:&lt;br/&gt;alipays://platformapi/startapp?appId=20000243&lt;br/&gt;收藏:&lt;br/&gt;alipays://platformapi/startapp?appId=20000245&lt;br/&gt;活动收款:&lt;br/&gt;alipays://platformapi/startapp?appId=20000259&lt;br/&gt;信用卡账单:&lt;br/&gt;alipays://platformapi/startapp?appId=20000266&lt;br/&gt;数字证书:&lt;br/&gt;alipays://platformapi/startapp?appId=20000298&lt;br/&gt;暗号:&lt;br/&gt;alipays://platformapi/startapp?appId=20000307&lt;br/&gt;支付宝账号:&lt;br/&gt;alipays://platformapi/startapp?appId=20000308&lt;br/&gt;1688好货源:&lt;br/&gt;alipays://platformapi/startapp?appId=20000522&lt;br/&gt;活动群:&lt;br/&gt;alipays://platformapi/startapp?appId=20000672&lt;br/&gt;我的客服:&lt;br/&gt;alipays://platformapi/startapp?appId=20000691&lt;br/&gt;淘宝会员名&lt;br/&gt;alipays://platformapi/startapp?appId=20000710&lt;br/&gt;蚂蚁微客：&lt;br/&gt;alipays://platformapi/startapp?appId=20000735&lt;br/&gt;在线理赔：&lt;br/&gt;alipays://platformapi/startapp?appId=20000750&lt;br/&gt;悄悄话：&lt;br/&gt;alipays://platformapi/startapp?appId=20000752&lt;br/&gt;滴滴出行：&lt;br/&gt;alipays://platformapi/startapp?appId=20000778&lt;br/&gt;小视频：&lt;br/&gt;alipays://platformapi/startapp?appId=20000780&lt;br/&gt;圈存机：&lt;br/&gt;alipays://platformapi/startapp?appId=20000791&lt;br/&gt;基金：&lt;br/&gt;alipays://platformapi/startapp?appId=20000793&lt;br/&gt;地铁票购票：&lt;br/&gt;alipays://platformapi/startapp?appId=20000796&lt;br/&gt;新的朋友：&lt;br/&gt;alipays://platformapi/startapp?appId=20000820&lt;br/&gt;云客服：&lt;br/&gt;alipays://platformapi/startapp?appId=20000827&lt;br/&gt;淘票票H5票券：&lt;br/&gt;alipays://platformapi/startapp?appId=20000834&lt;br/&gt;人脸识别：&lt;br/&gt;alipays://platformapi/startapp?appId=20000841&lt;br/&gt;大学生活：&lt;br/&gt;alipays://platformapi/startapp?appId=20000859&lt;br/&gt;国内机票逆向：&lt;br/&gt;alipays://platformapi/startapp?appId=20000877&lt;br/&gt;境外上网：&lt;br/&gt;alipays://platformapi/startapp?appId=20000895&lt;br/&gt;网商贷：&lt;br/&gt;alipays://platformapi/startapp?appId=20000899&lt;br/&gt;充值助手：&lt;br/&gt;alipays://platformapi/startapp?appId=20000905&lt;br/&gt;生活号：&lt;br/&gt;alipays://platformapi/startapp?appId=20000909&lt;br/&gt;网商银行：&lt;br/&gt;alipays://platformapi/startapp?appId=20000913&lt;br/&gt;社交H5：&lt;br/&gt;alipays://platformapi/startapp?appId=20000917&lt;br/&gt;车主服务：&lt;br/&gt;alipays://platformapi/startapp?appId=20000919&lt;br/&gt;发票管家：&lt;br/&gt;alipays://platformapi/startapp?appId=20000920&lt;br/&gt;汽车票：&lt;br/&gt;alipays://platformapi/startapp?appId=20000922&lt;br/&gt;口碑卡券：&lt;br/&gt;alipays://platformapi/startapp?appId=20000923&lt;br/&gt;蚂蚁保险：&lt;br/&gt;alipays://platformapi/startapp?appId=20000936&lt;br/&gt;支付结果页口碑推荐：&lt;br/&gt;alipays://platformapi/startapp?appId=20000939&lt;br/&gt;生活圈：&lt;br/&gt;alipays://platformapi/startapp?appId=20000943&lt;br/&gt;群聊：&lt;br/&gt;alipays://platformapi/startapp?appId=20000951&lt;br/&gt;有财教练：&lt;br/&gt;alipays://platformapi/startapp?appId=20000971&lt;br/&gt;口碑我的订单：&lt;br/&gt;alipays://platformapi/startapp?appId=20000975&lt;br/&gt;心愿储蓄-余额宝：&lt;br/&gt;alipays://platformapi/startapp?appId=20000981&lt;br/&gt;体育服务：&lt;br/&gt;alipays://platformapi/startapp?appId=20000988&lt;br/&gt;H5在线买单：&lt;br/&gt;alipays://platformapi/startapp?appId=20000989&lt;br/&gt;商家动态：&lt;br/&gt;alipays://platformapi/startapp?appId=20000991&lt;br/&gt;安全课堂：&lt;br/&gt;alipays://platformapi/startapp?appId=20001010&lt;br/&gt;照片：&lt;br/&gt;alipays://platformapi/startapp?appId=20001021&lt;br/&gt;拍摄：&lt;br/&gt;alipays://platformapi/startapp?appId=20001022&lt;br/&gt;财富交易组件：&lt;br/&gt;alipays://platformapi/startapp?appId=20001045&lt;br/&gt;大学充值缴费：&lt;br/&gt;alipays://platformapi/startapp?appId=20001091&lt;br/&gt;安全备忘：&lt;br/&gt;alipays://platformapi/startapp?appId=20001116&lt;br/&gt;一字千金：&lt;br/&gt;alipays://platformapi/startapp?appId=20001121&lt;br/&gt;送福卡：&lt;br/&gt;alipays://platformapi/startapp?appId=20002018&lt;br/&gt;小程序收藏：&lt;br/&gt;alipays://platformapi/startapp?appId=2018072560844004&lt;br/&gt;专属优惠频道：&lt;br/&gt;alipays://platformapi/startapp?appId=60000006&lt;br/&gt;国内机票React正向：&lt;br/&gt;alipays://platformapi/startapp?appId=60000007&lt;br/&gt;手艺人：&lt;br/&gt;alipays://platformapi/startapp?appId=60000008&lt;br/&gt;社交金融H5：&lt;br/&gt;alipays://platformapi/startapp?appId=60000010&lt;br/&gt;安全设备：&lt;br/&gt;alipays://platformapi/startapp?appId=60000011&lt;br/&gt;中小学：&lt;br/&gt;alipays://platformapi/startapp?appId=60000012&lt;br/&gt;口碑在线购买H5：&lt;br/&gt;alipays://platformapi/startapp?appId=60000014&lt;br/&gt;账单关联业务-h5：&lt;br/&gt;alipays://platformapi/startapp?appId=60000016&lt;br/&gt;基金组合：&lt;br/&gt;alipays://platformapi/startapp?appId=60000018&lt;br/&gt;蚂蚁保险：&lt;br/&gt;alipays://platformapi/startapp?appId=60000023&lt;br/&gt;商圈：&lt;br/&gt;alipays://platformapi/startapp?appId=60000026&lt;br/&gt;月度榜单：&lt;br/&gt;alipays://platformapi/startapp?appId=60000029&lt;br/&gt;电子证件：&lt;br/&gt;alipays://platformapi/startapp?appId=60000032&lt;br/&gt;in定制印品：&lt;br/&gt;alipays://platformapi/startapp?appId=60000033&lt;br/&gt;大牌抢购：&lt;br/&gt;alipays://platformapi/startapp?appId=60000039&lt;br/&gt;未来酒店：&lt;br/&gt;alipays://platformapi/startapp?appId=60000040&lt;br/&gt;支付成功页权益区：&lt;br/&gt;alipays://platformapi/startapp?appId=60000044&lt;br/&gt;社交聚合H5：&lt;br/&gt;alipays://platformapi/startapp?appId=60000050&lt;br/&gt;天天有料：&lt;br/&gt;alipays://platformapi/startapp?appId=60000071&lt;br/&gt;VIP预约服务：&lt;br/&gt;alipays://platformapi/startapp?appId=60000076&lt;br/&gt;优酷：&lt;br/&gt;alipays://platformapi/startapp?appId=60000077&lt;br/&gt;商家服务：&lt;br/&gt;alipays://platformapi/startapp?appId=60000081&lt;br/&gt;Mini 花呗：&lt;br/&gt;alipays://platformapi/startapp?appId=60000091&lt;br/&gt;电子公交卡：&lt;br/&gt;alipays://platformapi/startapp?appId=60000098&lt;br/&gt;奖励金：&lt;br/&gt;alipays://platformapi/startapp?appId=60000103&lt;br/&gt;银行卡：&lt;br/&gt;alipays://platformapi/startapp?appId=60000105&lt;br/&gt;定期+：&lt;br/&gt;alipays://platformapi/startapp?appId=60000119&lt;br/&gt;福员外：&lt;br/&gt;alipays://platformapi/startapp?appId=60000120&lt;br/&gt;投票：&lt;br/&gt;alipays://platformapi/startapp?appId=60000121&lt;br/&gt;淘票票H5购票：&lt;br/&gt;alipays://platformapi/startapp?appId=60000130&lt;br/&gt;质押资产：&lt;br/&gt;alipays://platformapi/startapp?appId=60000132&lt;br/&gt;外币兑换：&lt;br/&gt;alipays://platformapi/startapp?appId=60000134&lt;br/&gt;飞猪汽车票新版：&lt;br/&gt;alipays://platformapi/startapp?appId=60000135&lt;br/&gt;飞猪国内机票：&lt;br/&gt;alipays://platformapi/startapp?appId=60000138&lt;br/&gt;医疗健康：&lt;br/&gt;alipays://platformapi/startapp?appId=60000141&lt;br/&gt;财富运营承接中间页：&lt;br/&gt;alipays://platformapi/startapp?appId=60000142&lt;br/&gt;冻结金额：&lt;br/&gt;alipays://platformapi/startapp?appId=60000145&lt;br/&gt;h5券详情页面：&lt;br/&gt;alipays://platformapi/startapp?appId=60000147&lt;br/&gt;财富号：&lt;br/&gt;alipays://platformapi/startapp?appId=60000148&lt;br/&gt;我的口碑：&lt;br/&gt;alipays://platformapi/startapp?appId=60000150&lt;br/&gt;快消优惠：&lt;br/&gt;alipays://platformapi/startapp?appId=60000151&lt;br/&gt;支付签约中心:&lt;br/&gt;alipays://platformapi/startapp?appId=60000157&lt;br/&gt;借呗任务平台:&lt;br/&gt;alipays://platformapi/startapp?appId=60000158&lt;br/&gt;周周乐:&lt;br/&gt;alipays://platformapi/startapp?appId=60000161&lt;br/&gt;表情搜索:&lt;br/&gt;alipays://platformapi/startapp?appId=60000163&lt;br/&gt;小程序:&lt;br/&gt;alipays://platformapi/startapp?appId=66666666&lt;br/&gt;会员卡:&lt;br/&gt;alipays://platformapi/startapp?appId=66666667&lt;br/&gt;口碑资源加速二:&lt;br/&gt;alipays://platformapi/startapp?appId=66666669&lt;br/&gt;国际资源加速一:&lt;br/&gt;alipays://platformapi/startapp?appId=66666670&lt;br/&gt;新消息通知:&lt;br/&gt;alipays://platformapi/startapp?appId=66666672&lt;br/&gt;风险评测:&lt;br/&gt;alipays://platformapi/startapp?appId=66666673&lt;br/&gt;口碑生活圈问答:&lt;br/&gt;alipays://platformapi/startapp?appId=66666675&lt;br/&gt;账单详情:&lt;br/&gt;alipays://platformapi/startapp?appId=66666676&lt;br/&gt;亚博游戏:&lt;br/&gt;alipays://platformapi/startapp?appId=66666677&lt;br/&gt;AR:&lt;br/&gt;alipays://platformapi/startapp?appId=66666678&lt;br/&gt;新人气榜单:&lt;br/&gt;alipays://platformapi/startapp?appId=66666679&lt;br/&gt;福卡回忆:&lt;br/&gt;alipays://platformapi/startapp?appId=66666682&lt;br/&gt;集分宝:&lt;br/&gt;alipays://platformapi/startapp?appId=66666683&lt;br/&gt;信用借还:&lt;br/&gt;alipays://platformapi/startapp?appId=66666684&lt;br/&gt;网银大额充值:&lt;br/&gt;alipays://platformapi/startapp?appId=66666685&lt;br/&gt;泛行业频道:&lt;br/&gt;alipays://platformapi/startapp?appId=66666686&lt;br/&gt;jet离线加速一:&lt;br/&gt;alipays://platformapi/startapp?appId=66666687&lt;br/&gt;我的发票抬头:&lt;br/&gt;alipays://platformapi/startapp?appId=66666688&lt;br/&gt;附近人气榜:&lt;br/&gt;alipays://platformapi/startapp?appId=66666689&lt;br/&gt;店铺弹窗领券:&lt;br/&gt;alipays://platformapi/startapp?appId=66666691&lt;br/&gt;小程序资源包:&lt;br/&gt;alipays://platformapi/startapp?appId=66666692&lt;br/&gt;标签系统:&lt;br/&gt;alipays://platformapi/startapp?appId=66666698&lt;br/&gt;境外当面付店铺码:&lt;br/&gt;alipays://platformapi/startapp?appId=66666699&lt;br/&gt;实物黄金:&lt;br/&gt;alipays://platformapi/startapp?appId=66666700&lt;br/&gt;appraise:&lt;br/&gt;alipays://platformapi/startapp?appId=66666702&lt;br/&gt;打开支付宝:&lt;br/&gt;alipays://platformapi/startapp?appId=66666706&lt;br/&gt;mallcoupon:&lt;br/&gt;alipays://platformapi/startapp?appId=66666707&lt;br/&gt;商圈聚合页:&lt;br/&gt;alipays://platformapi/startapp?appId=66666710&lt;br/&gt;天猫资源加速:&lt;br/&gt;alipays://platformapi/startapp?appId=66666711&lt;br/&gt;芝麻信用:&lt;br/&gt;alipays://platformapi/startapp?appId=66666713&lt;br/&gt;信用卡还款H5:&lt;br/&gt;alipays://platformapi/startapp?appId=66666715&lt;br/&gt;小程序关于页面:&lt;br/&gt;alipays://platformapi/startapp?appId=66666718&lt;br/&gt;功能管理:&lt;br/&gt;alipays://platformapi/startapp?appId=66666719&lt;br/&gt;钱包股票-社区资讯:&lt;br/&gt;alipays://platformapi/startapp?appId=66666721&lt;br/&gt;钱包股票-行情和提醒:&lt;br/&gt;alipays://platformapi/startapp?appId=66666722&lt;br/&gt;统一授权管理:&lt;br/&gt;alipays://platformapi/startapp?appId=66666724&lt;br/&gt;区块链:&lt;br/&gt;alipays://platformapi/startapp?appId=66666728&lt;br/&gt;口碑红人:&lt;br/&gt;alipays://platformapi/startapp?appId=66666729&lt;br/&gt;花呗挖哦:&lt;br/&gt;alipays://platformapi/startapp?appId=66666733&lt;br/&gt;基金组合：&lt;br/&gt;alipays://platformapi/startapp?appId=66666735&lt;br/&gt;财富社区：&lt;br/&gt;alipays://platformapi/startapp?appId=66666741&lt;br/&gt;口碑平台弹层：&lt;br/&gt;alipays://platformapi/startapp?appId=66666742&lt;br/&gt;定时转账提醒：&lt;br/&gt;alipays://platformapi/startapp?appId=66666743&lt;br/&gt;店铺详情页报错：&lt;br/&gt;alipays://platformapi/startapp?appId=66666749&lt;br/&gt;保险号：&lt;br/&gt;alipays://platformapi/startapp?appId=66666750&lt;br/&gt;商圈券包：&lt;br/&gt;alipays://platformapi/startapp?appId=66666754&lt;br/&gt;我的健康：&lt;br/&gt;alipays://platformapi/startapp?appId=66666755&lt;br/&gt;国际支付成功页：&lt;br/&gt;alipays://platformapi/startapp?appId=66666757&lt;br/&gt;流量钱包&lt;br/&gt;alipays://platformapi/startapp?appId=66666759&lt;br/&gt;消费捐：&lt;br/&gt;alipays://platformapi/startapp?appId=66666761&lt;br/&gt;车金融：&lt;br/&gt;alipays://platformapi/startapp?appId=66666762&lt;br/&gt;阿里智能：&lt;br/&gt;alipays://platformapi/startapp?appId=66666773&lt;br/&gt;商家说：&lt;br/&gt;alipays://platformapi/startapp?appId=66666774&lt;br/&gt;境外收款：&lt;br/&gt;alipays://platformapi/startapp?appId=66666777&lt;br/&gt;懒人一键理财：&lt;br/&gt;alipays://platformapi/startapp?appId=66666779&lt;br/&gt;支付宝刷脸付：&lt;br/&gt;alipays://platformapi/startapp?appId=66666781&lt;br/&gt;蚂蚁庄园星星球：&lt;br/&gt;alipays://platformapi/startapp?appId=66666782&lt;br/&gt;爱攒油加油站：&lt;br/&gt;alipays://platformapi/startapp?appId=66666783&lt;br/&gt;亲情圈：&lt;br/&gt;alipays://platformapi/startapp?appId=66666784&lt;br/&gt;飞猪酒店：&lt;br/&gt;alipays://platformapi/startapp?appId=66666787&lt;br/&gt;火车票正向主流程：&lt;br/&gt;alipays://platformapi/startapp?appId=66666788&lt;br/&gt;商家经营分析：&lt;br/&gt;alipays://platformapi/startapp?appId=66666791&lt;br/&gt;人传人转账拉新&lt;br/&gt;alipays://platformapi/startapp?appId=66666796&lt;br/&gt;飞猪国际机票WEEX：&lt;br/&gt;alipays://platformapi/startapp?appId=66666807&lt;br/&gt;芝麻认证小程序：&lt;br/&gt;alipays://platformapi/startapp?appId=66666808&lt;br/&gt;财富通用工具：&lt;br/&gt;alipays://platformapi/startapp?appId=66666810&lt;br/&gt;小钱袋：&lt;br/&gt;alipays://platformapi/startapp?appId=66666816&lt;br/&gt;Tinyjs资源：&lt;br/&gt;alipays://platformapi/startapp?appId=66666817&lt;br/&gt;财富标签页：&lt;br/&gt;alipays://platformapi/startapp?appId=66666825&lt;br/&gt;泛行业会场：&lt;br/&gt;alipays://platformapi/startapp?appId=66666827&lt;br/&gt;小富婆：&lt;br/&gt;alipays://platformapi/startapp?appId=66666829&lt;br/&gt;一字千金：&lt;br/&gt;alipays://platformapi/startapp?appId=66666831&lt;br/&gt;招牌来了：&lt;br/&gt;alipays://platformapi/startapp?appId=66666860&lt;br/&gt;直播频道：&lt;br/&gt;alipays://platformapi/startapp?appId=66666861&lt;br/&gt;口碑快消频道页：&lt;br/&gt;alipays://platformapi/startapp?appId=66666865&lt;br/&gt;智能设备：&lt;br/&gt;alipays://platformapi/startapp?appId=66666877&lt;br/&gt;淘票票H5资讯：&lt;br/&gt;alipays://platformapi/startapp?appId=66666881&lt;br/&gt;口碑资源加速包一：&lt;br/&gt;alipays://platformapi/startapp?appId=66666884&lt;br/&gt;国际机票交易：&lt;br/&gt;alipays://platformapi/startapp?appId=66666888&lt;br/&gt;工资理财：&lt;br/&gt;alipays://platformapi/startapp?appId=66666897&lt;br/&gt;银行卡：&lt;br/&gt;alipays://platformapi/startapp?appId=68686988&lt;br/&gt;2018五福首页：&lt;br/&gt;alipays://platformapi/startapp?appId=68687002&lt;br/&gt;2018新春集五福：&lt;br/&gt;alipays://platformapi/startapp?appId=68687028&lt;br/&gt;信用租承接：&lt;br/&gt;alipays://platformapi/startapp?appId=68687032&lt;br/&gt;appxNativeIOS框架包：&lt;br/&gt;alipays://platformapi/startapp?appId=68687035&lt;br/&gt;蚂蚁星愿：&lt;br/&gt;alipays://platformapi/startapp?appId=68687049&lt;br/&gt;Apple 专区：&lt;br/&gt;alipays://platformapi/startapp?appId=68687052&lt;br/&gt;养老金：&lt;br/&gt;alipays://platformapi/startapp?appId=68687131&lt;br/&gt;人脸、指纹、声纹：&lt;br/&gt;alipays://platformapi/startapp?appId=68687140&lt;br/&gt;安全设置：&lt;br/&gt;alipays://platformapi/startapp?appId=68687141&lt;br/&gt;支付宝授权：&lt;br/&gt;alipays://platformapi/startapp?appId=68687142&lt;br/&gt;股票发现-支付宝：&lt;br/&gt;alipays://platformapi/startapp?appId=68687145&lt;br/&gt;小程序收藏：&lt;br/&gt;alipays://platformapi/startapp?appId=68687164&lt;br/&gt;信用受理台：&lt;br/&gt;alipays://platformapi/startapp?appId=68687167&lt;br/&gt;星巴克用星说：&lt;br/&gt;alipays://platformapi/startapp?appId=77700096&lt;br/&gt;小程序分享二维码：&lt;br/&gt;alipays://platformapi/startapp?appId=77700109&lt;/p&gt;</description><pubDate>Fri, 12 Jan 2024 10:47:22 +0800</pubDate></item><item><title>CentOS8配置本地yum源</title><link>http://blogcenter.cn/?id=249</link><description>&lt;p&gt;&lt;strong&gt;要切换到root用户下进行以下操作&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;一 、创建我们准备要挂载目录&lt;/h3&gt;&lt;p&gt;mkdir -p /media/cdrom&lt;/p&gt;&lt;h3&gt;&lt;a id=&quot;t2&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;二 、将光盘目录挂载到/media/cdrom目录下&lt;/h3&gt;&lt;p&gt;mount /dev/cdrom /media/cdrom&lt;/p&gt;&lt;p&gt;挂载时报错：mount: no medium found on /dev/sr0&lt;/p&gt;&lt;p&gt;2、 解决方法：&lt;/p&gt;&lt;p&gt;确保设备状态勾选、使用iso镜像文件&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/01/20240109100255_81082.png&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;用df -h命令查看挂载结果&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/01/20240109100255_56950.png&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;h3&gt;三、配置开机自动挂起&lt;/h3&gt;&lt;p&gt;vim /etc/fstab&lt;/p&gt;&lt;p&gt;#在最后一行添加如下代码&lt;/p&gt;&lt;p&gt;/dev/cdrom /media/cdrom iso9660 defaults 0 0&lt;/p&gt;&lt;h3&gt;四、配置本地yum源&lt;/h3&gt;&lt;p&gt;注意：centos8已经不是CentOS-Media.repo，已经改为CentOS-Linux-Media.repo&lt;/p&gt;&lt;p&gt;cd /etc/yum.repos.d&lt;/p&gt;&lt;p&gt;vim CentOS-Media.repo&lt;/p&gt;&lt;p&gt;以下红框为需要修改的地方（图片里为正确的修改）&lt;/p&gt;&lt;p&gt;baseurl：指定挂载目录下的BaseOS和AppStream&lt;/p&gt;&lt;p&gt;gpgcheck：是否校验&lt;/p&gt;&lt;p&gt;enable：是否启用该镜像&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/01/20240109100256_66333.png&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;接下来依次打开CentOS-AppStream.repo、CentOS-Base.repo和CentOS-Extras.repo，分别修改enable=0 。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/01/20240109100256_86208.png&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;h3&gt;五、更新yum源&lt;/h3&gt;&lt;p&gt;yum clean all&lt;/p&gt;&lt;p&gt;yum makecache&lt;/p&gt;&lt;p&gt;验证有没有配成功&lt;/p&gt;&lt;p&gt;yum install httpd&lt;/p&gt;&lt;p&gt;出现如下结果证明成功了&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2024/01/20240109100256_83940.png&quot; class=&quot;medium-zoom-image&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 09 Jan 2024 10:02:10 +0800</pubDate></item><item><title>Spring-boot启动添加参数</title><link>http://blogcenter.cn/?id=248</link><description>&lt;h2&gt;1、IDEA中添加参数&lt;/h2&gt;&lt;p&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2021/08/20210818140150_93977.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;2218&quot; data-rawheight=&quot;952&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; data-original=&quot;https://pic1.zhimg.com/v2-f4992172d07f481ae60b9e64dcf1da94_r.jpg&quot; data-actualsrc=&quot;https://pic1.zhimg.com/v2-f4992172d07f481ae60b9e64dcf1da94_b.jpg&quot; data-lazy-status=&quot;ok&quot; alt=&quot;&quot; style=&quot;width: 967px; height: 337px;&quot; width=&quot;967&quot; vspace=&quot;0&quot; height=&quot;337&quot; border=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;添加以下参数(二选一即可)&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;-Dspring.profiles.active=test&amp;nbsp;-Dserver.port=8081#&amp;nbsp;或spring.profiles.active=test;server.port=8081&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;2、启动时添加参数&lt;/h2&gt;&lt;p&gt;对应上面的参数在启动jar包是添加参数&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;第一种&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;java&amp;nbsp;-jar&amp;nbsp;-Dspring.profiles.active=test&amp;nbsp;-Dserver.port=8081&amp;nbsp;app.jar&lt;/pre&gt;&lt;/div&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;第二种&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;java&amp;nbsp;-jar&amp;nbsp;app.jar&amp;nbsp;--spring.profiles.active=test&amp;nbsp;--server.port=8081&lt;/pre&gt;&lt;/div&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;第三种，混合使用&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;java&amp;nbsp;-jar&amp;nbsp;-Dspring.profiles.active=test&amp;nbsp;app.jar&amp;nbsp;--server.port=8081&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;3、服务器&lt;/h2&gt;&lt;h3&gt;编写shell脚本&lt;/h3&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;APP_NAME=app.jar#使用说明，用来提示输入参数
usage()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;Usage:&amp;nbsp;sh&amp;nbsp;执行脚本.sh&amp;nbsp;[start|stop|restart|status]&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;1
}
#检查程序是否在运行
is_exist()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pid=$(ps&amp;nbsp;-ef&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;$APP_NAME&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;-v&amp;nbsp;grep&amp;nbsp;|&amp;nbsp;awk&amp;nbsp;&amp;#39;{print&amp;nbsp;$2}&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#如果不存在返回1，存在返回0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;-z&amp;nbsp;&amp;quot;${pid}&amp;quot;&amp;nbsp;];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#启动方法
start()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is_exist
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;$?&amp;nbsp;-eq&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;${APP_NAME}&amp;nbsp;is&amp;nbsp;already&amp;nbsp;running.&amp;nbsp;pid=${pid}&amp;nbsp;.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nohup&amp;nbsp;java&amp;nbsp;-jar&amp;nbsp;$APP_NAME&amp;nbsp;&amp;gt;/dev/null&amp;nbsp;2&amp;gt;&amp;amp;1&amp;nbsp;&amp;amp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
}
#停止方法stop()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is_exist
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;$?&amp;nbsp;-eq&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kill&amp;nbsp;-9&amp;nbsp;$pid
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;${APP_NAME}&amp;nbsp;is&amp;nbsp;not&amp;nbsp;running&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
}
#输出运行状态
status()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is_exist
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;$?&amp;nbsp;-eq&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;${APP_NAME}&amp;nbsp;is&amp;nbsp;running.&amp;nbsp;Pid&amp;nbsp;is&amp;nbsp;${pid}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;${APP_NAME}&amp;nbsp;is&amp;nbsp;NOT&amp;nbsp;running.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#重启
restart()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start
}
#根据输入参数，选择执行对应方法，不输入则执行使用说明

case&amp;nbsp;&amp;quot;$1&amp;quot;&amp;nbsp;in
&amp;quot;start&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;quot;stop&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;quot;status&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;status
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;quot;restart&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;restart
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
*)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usage
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
esac&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;将app.jar 和 app.sh脚本上传同一级目录中&lt;/h3&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2021/08/20210818140150_94985.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;644&quot; data-rawheight=&quot;108&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; data-original=&quot;https://pic3.zhimg.com/v2-6dbcd59ef72abcb6f012f3959a7f1f4a_r.jpg&quot; data-actualsrc=&quot;https://pic3.zhimg.com/v2-6dbcd59ef72abcb6f012f3959a7f1f4a_b.jpg&quot; data-lazy-status=&quot;ok&quot; width=&quot;644&quot;/&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3&gt;启动脚本&lt;/h3&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;#&amp;nbsp;sh&amp;nbsp;app.sh&amp;nbsp;[start|stop|restart|status]&amp;nbsp;对用启动、停止、重启、查看状态
sh&amp;nbsp;app.sh&amp;nbsp;start&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 18 Aug 2021 13:54:04 +0800</pubDate></item><item><title>Spring Boot非Web项目运行的方法</title><link>http://blogcenter.cn/?id=247</link><description>&lt;p&gt;有时候一些项目并不需要提供 Web 服务，例如跑定时任务的项目，如果都按照 Web 项目启动未免画蛇添足浪费资源&lt;/p&gt;&lt;p&gt;为了达到非 Web 运行的效果，首先调整 Maven 依赖，不再依赖 spring-boot-starter-web，转而依赖最基础的 spring-boot-starter：&lt;/p&gt;&lt;div class=&quot;jb51code&quot;&gt;&lt;div&gt;&lt;div id=&quot;highlighter_447415&quot; class=&quot;syntaxhighlighter  java&quot;&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;1&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;2&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;3&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;4&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;5&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;6&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;&amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;这时候 SpringBootApplication 的程序入口在执行完main方法后直接exit了, 现在需要hold应用程序防止直接退出, 有两种方法:&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;实现 CommandLineRunner&amp;nbsp;&amp;nbsp; springboot 2.0.0之后用 &amp;nbsp;ApplicationRunner 接口在run方法中通过 &lt;code&gt;Thread.currentThread().join() &lt;/code&gt;使得应用程序在执行run方法时阻塞, 这样程序就可以保持运行&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;通过 Spring Boot 提供的配置(推荐):&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: square;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;Spring Boot 2.0.0 以上的版本: spring.main.web-application-type=NONE // REACTIVE, SERVLET&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Spring Boot 2.0.0 之前的版本: spring.main.web-environment=false&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;此时按照原先的方式启动 SpringBootApplication 会发现启动加载完之后会立即退出，这时需要做点工作让主线程阻塞让程序不退出：&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;1&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;2&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;3&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;4&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;5&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;6&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;7&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;8&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;9&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;10&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;code class=&quot;java color1&quot;&gt;@SpringBootApplication&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;SampleApplication &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;implements&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;CommandLineRunner {&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;static&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;main(String[] args) &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;throws&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Exception {&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;SpringApplication.run(SampleApplication.&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;, args);&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java color1&quot;&gt;@Override&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;run(String... args) &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;throws&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Exception {&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;Thread.currentThread().join();&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、springboot 1.x中以非web方式启动&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;cnblogs_Highlighter sh-gutter&quot;&gt;&lt;pre&gt;//&amp;nbsp;启动方式1
SpringApplication&amp;nbsp;app&amp;nbsp;=&amp;nbsp;new&amp;nbsp;SpringApplication(Application.class);
app.setWebEnvironment(false);//&amp;nbsp;设置ApplicationContext类型
ApplicationContext&amp;nbsp;ctx&amp;nbsp;=&amp;nbsp;app.run(args);&lt;/pre&gt;&lt;div&gt;&lt;div id=&quot;highlighter_238616&quot; class=&quot;syntaxhighlighter  java&quot;&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;1&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;2&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;3&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;4&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;5&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;6&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;7&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;8&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;9&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;10&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;11&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;12&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;13&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;14&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;15&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;16&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;17&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;code class=&quot;java comments&quot;&gt;// 启动方式2&amp;lt;br&amp;gt;@SpringBootApplication&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Application &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;implements&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;ApplicationRunner{&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;static&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;main(String[] args) {&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;new&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;SpringApplicationBuilder()&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;.sources(Application.&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;).web(&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;false&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;).run(args);&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java color1&quot;&gt;@Override&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;run(ApplicationArguments args) &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;throws&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Exception {&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;while&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;(&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;true&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;) {&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;System.out.println(&lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&amp;quot;now is &amp;quot;&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;+ &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;new&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Date().toLocaleString());&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;Thread.sleep(&lt;/code&gt;&lt;code class=&quot;java value&quot;&gt;1000&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;);&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;}&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、springboot 2.0中以非web方式启动&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;-web(false)/setWebEnvironment(false) is deprecated and instead Web-Application-Type can be used to specify&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;attribute&quot;&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;1&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;2&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;3&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;4&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;5&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;6&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;7&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;8&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;9&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;10&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;11&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;12&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;13&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;14&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;15&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;16&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;17&lt;/div&gt;&lt;div class=&quot;line number18 index17 alt1&quot;&gt;18&lt;/div&gt;&lt;div class=&quot;line number19 index18 alt2&quot;&gt;19&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;# 配置spring.main.web-application-type=NONE# 代码&lt;/code&gt;&lt;code class=&quot;java color1&quot;&gt;@SpringBootApplication&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Application &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;implements&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;ApplicationRunner{&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;static&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;main(String[] args) {&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;new&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;SpringApplicationBuilder(Application.&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;)&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;.web(WebApplicationType.NONE) &lt;/code&gt;&lt;code class=&quot;java comments&quot;&gt;// .REACTIVE, .SERVLET&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;.bannerMode(Banner.Mode.OFF)&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;.run(args);&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java color1&quot;&gt;@Override&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;run(ApplicationArguments args) &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;throws&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Exception {&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;while&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;(&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;true&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;) {&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;System.out.println(&lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&amp;quot;now is &amp;quot;&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;+ &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;new&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Date().toLocaleString());&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;Thread.sleep(&lt;/code&gt;&lt;code class=&quot;java value&quot;&gt;1000&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;);&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number18 index17 alt1&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;line number19 index18 alt2&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 17 Aug 2021 16:03:39 +0800</pubDate></item><item><title>GC垃圾收集器&amp;amp;JVM调优汇总 </title><link>http://blogcenter.cn/?id=246</link><description>&lt;h3 id=&quot;1-垃圾收集器&quot;&gt;1 垃圾收集器&lt;/h3&gt;&lt;h4 id=&quot;11-serialserial-old-收集器&quot;&gt;1.1 Serial/Serial Old 收集器：&lt;/h4&gt;&lt;p&gt;Serial 收集器作用于年轻代中， 采用 复制算法 ， 属于串行回收方式&lt;/p&gt;&lt;p&gt;Serial Old 收集器 采用串行回收， STW机制， 采用 标记-压缩 算法 ，&lt;/p&gt;&lt;p&gt;

 	“-XX:+UseSerialGC” 手动指定Serial收集器执行内存回收任务&lt;/p&gt;&lt;p&gt;	“-XX:+PrintGCDetails” 年轻代串行收集器的工作日志开关&lt;/p&gt;&lt;h4 id=&quot;12-parnew-收集器&quot;&gt;1.2 ParNew 收集器&lt;/h4&gt;&lt;p&gt;ParnNew 可以说是Serial收集器的多线程版本， ParNew 收集器在 年轻代 中同样才用的也是复制算法 和 STW &amp;nbsp;机制 &amp;nbsp;并行回收机制。&lt;/p&gt;&lt;p&gt;ParnNew 收集器的优势体现在多CPU，多核心的环境中， &amp;nbsp; 在某些注重低延迟的应用场景下ParNew 和 CMS 收集器的组合模式， 在Server 模式下的内存回收效果很好。&lt;/p&gt;&lt;p&gt;使用 “-XX:+UserParNewGC” 手动指定使用ParNew收集器 “&lt;/p&gt;&lt;p&gt;-XX:+UserParallelGC” 表示 年轻代使用并行垃圾回收器， 老年代使用串行收集器&lt;/p&gt;&lt;h4 id=&quot;13-parallelparallel-old-收集器&quot;&gt;1.3 Parallel/Parallel Old 收集器&lt;/h4&gt;&lt;p&gt;Parallel收集器是并行回收 采用复制算法 年轻代 STW ， 和ParNew不同Parrllel收集器可以控制程序的吞吐量大小 ， &amp;nbsp;被称为-吞吐量优先的垃圾收集器.&lt;/p&gt;&lt;p&gt;Parallel Old采用标记整理算法，用于老年代的垃圾回收。&lt;/p&gt;&lt;h5 id=&quot;常用参数&quot;&gt;常用参数:&lt;/h5&gt;&lt;p&gt;“-XX:+GCTimeRatio:N” 设置执行内存回收的时间所占JVM运行总时间的比例， 1/(1+N) 默认N为99&lt;/p&gt;&lt;p&gt;“-XX:+MaxGCPauseMills” 设置执行内存回收STW 的暂停时间阈值， 若指定该值，则尽可能地在设定的时间内完成内存回收。&lt;/p&gt;&lt;p&gt;“-XX:+UseAdaptiveSizePolicy” 选项用于设置GC的自动分代大小调节策略。&lt;/p&gt;&lt;p&gt;“-XX:UseParallelOldGC”可在年轻代和老年代都是用并行回收收集器， 此收集器重点关注吞吐量&lt;/p&gt;&lt;p&gt;“-XX:ParallelGCThreads” 可用于设置垃圾回收时的线程数量&lt;/p&gt;&lt;p&gt;Parallel Old 收集器采用了 标记-压缩算法 ， 用于老年代垃圾回收 ， 并行回收 STW&lt;/p&gt;&lt;p&gt;Parallel 和 Parallel Old 收集器的组合 在Server 模式下的内存回收性能较好。&lt;/p&gt;&lt;h4 id=&quot;14-cmsconcurrent-mark-sweep-收集器&quot;&gt;1.4 CMS(Concurrent-Mark-Sweep) 收集器&lt;/h4&gt;&lt;p&gt;基于低延迟的考虑 &amp;nbsp;， 是并行垃圾回收器， 而且是老年代垃圾收集， 低延迟， 采用标记清除算法。会有短暂的STW&lt;/p&gt;&lt;p&gt;基本步骤如下 ：&lt;/p&gt;&lt;p&gt;

 	1. 初始标记(Initial Mark) ： STW 标记根对象直接关联、可达的对象&lt;br/&gt;
 	2. 并发标记(Concurrent Mark) ：将不可达对象 标记为垃圾对象 
 	3. 再次标记(Remark) ： STW 确保垃圾对象被成功且正确得标记&lt;br/&gt;
 	4. 并发清除(Concurrent Sweep)： 垃圾回收&lt;br/&gt;&lt;/p&gt;&lt;h5 id=&quot;常用参数-1&quot;&gt;常用参数:&lt;/h5&gt;&lt;p&gt;“-XX:+UseCMS-CompactAtFullCollection” 用于指定在执行完FullGC 之后 是否对内存空间进行压缩整理，&lt;/p&gt;&lt;p&gt;“-XX:+CMSFullGCs-BeforeCompaction” 设定在执行多少次FullGC 之后对内存空间进行压缩整理&lt;/p&gt;&lt;p&gt;“-XX:+CMSInitiatingOccupanyFraction” 设置老年代中的内存使用率达到多少百分比的时候执行内存回收 
JDK1.6之前默认值为68% JDK1.6 之后默认92% &amp;nbsp;, 
CMS垃圾收集器在回收过程中程依然可能会产生垃圾，所以需要设定一个阈值来进行垃圾回收，如果CMS回收失败，JVM则会启动老年代串行收集器进行垃圾回收，程序的STW时间会较长，
 所以可以在内存增长缓慢的程序里面设置较大阈值，在内存增长快速的程序里面设置较小的阈值， 避免触发老年代串行收集器。&lt;/p&gt;&lt;p&gt;“-XX:UseConMarkSweepGC” 表示年轻代使用并行收集器，老年代使用CMS &amp;nbsp;年轻代 &amp;nbsp;并行收集器工作时的线程数量可以使用 “-XX:ParallelGCThreads” 选项指定， &amp;nbsp;一般最好与CPU的数量相当.&lt;/p&gt;&lt;h4 id=&quot;15-g1garbage-first-收集器&quot;&gt;1.5 G1(Garbage-First) 收集器&lt;/h4&gt;&lt;p&gt;G1将整个堆划分为若干个大小相等的区间（1-32MB）,Region类型分为Unused Region、Eden Region 和 
Survivor Region组成了年轻代空间，Old Region， Humongous 
Region(里面的对象超过每个Region的50%)，&lt;/p&gt;&lt;p&gt;每个Region都会有一个Region Set （RS），RS的数据结构是Hash表，里面的数据是CardTable 
（堆中没512Byte 映射在 card table 1 byte ） ， 简单说 RS 里面存的是Region种存活对象的指针。 
当Region中数据发生变化的时候 ，首先反映到Card Table 中的一个或者对个card上，RS通过扫面内部的Card Table 
得知Region中内存使用情况和存活对象，在使用Region过程中，如果一个Region被填满了，分配内存的线程会重新选择一个新的Region，空闲Region被组织到一个基于链表的数据结构（LinkedList
 ）中，这样可以快速找到Region.&lt;/p&gt;&lt;p&gt;G1 GC 可以分为 Young GC 和Mixed GC&lt;/p&gt;&lt;p&gt;年轻代GC：当年轻代达到一定的阈值，就开始年轻代的并发收集。将Eden Region中存活对象copy转移到Survivor的Region中，同时释放Eden Region 。 存活的时间够久就移到Old Reagion。&lt;/p&gt;&lt;p&gt;Mixed GC： 当Old Region占比达到一定的比例（通过 -XX:InitantingHeapOccupancyPercent 
设置，默认45%）之后，会触发并行标记，然后就会进行Mixed GC。 Mixed GC 
对一个叫做CSet的Region集合进行垃圾回收，其中包含了所有的年轻代Region和选取的一部分回收效益最好的Old Region。&lt;/p&gt;&lt;p&gt;并发标记的过程类似于CMS中的标记过程。&lt;/p&gt;&lt;h5 id=&quot;g1-可选优化参数&quot;&gt;G1 可选优化参数&lt;/h5&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;年轻代优化&lt;/p&gt;&lt;p&gt;-XX:G1NewSizePercent &amp;nbsp; Java 堆初始化大小 ，默认是整个Java堆大小的5%，&lt;/p&gt;&lt;p&gt;-XX:G1MaxNewPercent &amp;nbsp;最大占用对内存的百分比，默认是60%&lt;/p&gt;&lt;p&gt;-XX:MaxGCPauseMills 每次目标停顿时间, 默认200ms&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;可以根据上述三个参数的调整来优化年轻代的垃圾回收&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;并行标记阶段优化&lt;/p&gt;&lt;p&gt;并行标记阶段， -XX:InitantingHeapOccupancyPercent 决定了什么时候初始化并行标记循环 默认值45%&lt;/p&gt;&lt;p&gt;-XX:ConcGCThreads 并发GC数量， 是-XX:ParallelGCThreads 的1/4 ，可以通过修改两个值来改变并线程的数量。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;混合回收阶段优化&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;-XX:+PrintAdaptiveSizePoliy 开启后会输出完成的GC生态日志，&lt;/p&gt;&lt;p&gt;-XX:G1HeapWastePercent 表示最大可忍受的垃圾总量，默认是堆空间的5%，如果Mixed GC占用的时间过多，可以将此值调整大一点。&lt;/p&gt;&lt;p&gt;-XX:G1MixedGCCountTarget 默认为8，表示Mixed GC过程中入选的Old Region的最小阈值，用于控制入选的Old Region的数量&lt;/p&gt;&lt;p&gt;-XX:G1OldCSetRegionThresholdPercent 默认值100% ，表示加入到CSet中的Old Region的最大数量。&lt;/p&gt;&lt;p&gt;-XX:G1MixedGCLiveThresholdPercent 默认值 85% ，表示设置的每CSet中每个区间最多存活对象的百分比。&lt;/p&gt;&lt;h4 id=&quot;2-jvm的一些常用参数&quot;&gt;2 JVM的一些常用参数&lt;/h4&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;-XX:+PrintGCDetails 用于记录GC运行时的详细信息并输出。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-verbose:gc -Xloggc:gc.log &amp;nbsp;结合前一个选项可以在项目根目录下生成gc.log文件记录gc详细信息&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UseSerialGC 使用串行gc收集器，使用与小于100MB的内存空间场景&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UserParNewGC 独占式GC ， 多线程GC &amp;nbsp;（未来不可用）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UseParallelGC&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UseParallelOldGC&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UseConcMarkSweepGC&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UseG1GC&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+PrintGCApplicationStoppedTime 输出GC造成应用程序暂停的时间&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+PrintGCApplicationConcurrentTime 与上面参数结合使用&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+ConcGCThreads=4 设置Java应用程序线程并行执行的GC线程数量 
若设置的值超过JVM允许GC并行线程的数量则报错， &amp;nbsp;	默认的并行标记线程数量计算如下 &amp;nbsp;	ConGCThreads = 
Max((ParallelGCThreads#+2)/4,1)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:G1HeapRegionSize G1 GC 独有，Region大小默认为堆的1/2000 也可以设置 &amp;nbsp;	1MB 2MB 4MB 8MB 16MB 32MB 等6个档次&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:G1HeapWastePercent=5 控制G1GC 不会回收的空闲内存比例，默认是堆内存的5% 	G1 GC在回收过程中会回收所有Region的内存，并持续地进行回收工作，直到内存空闲比例达到次值&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:G1MixedGCCountTarget=8 老年代Region 
的回收时间通常来说比年轻带Region回收时间长，此选项设置并行循环之后启动多少个混合GC 默认值是 8个 	设置一个比较大的值可以让G1 
GC在老年代Region回收时多花一些时间，如果一个混合GC停顿的时间很长，说明它要做的使很多，所以可以增大这个值的设置，但这个值过大的话，会造成并行循环等待混合GC完成的时间也相应的增加。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:G1PrintRegionLivenessInfo 开启这个选项会在标记循环之后输出详细信息（诊断选项） 	
在使用之前需要开启-XX:UnlockDiagnosticVMOptions 选项， 此选项会打印内存内部每个Region里面存活的对象信息， 
包括使用率 RSET大小、回收一个Region的价值（性价比） 15. -XX:G1ReservePercent=10 
此选项默认保留对内存的10%，用于某个对象进入下一个阶段，预留内存空间不可用于年轻带&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+G1SummarizeRSetStats &amp;nbsp;打印每个Region的详细信息。 &amp;nbsp;	
此选项和-XX:G1PrintRegionLivenessInfo选项一样，是一个诊断选项也需要开启 
-XX:UnlockDiagnosticVMOptions 选项 。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+G1TraceConcRefinement 诊断选项，启动这个选项，并行Refinement线程相关的信息会被打印，线程启动和结束时，信息都会被打印。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:G1UseAdaptiveConcRefinement 默认开启的选项， 	
它会动态地对每一次GC中-XX:G1ConcRefinementGreenZone、-XX:G1ConcRfinementYellowZone、-XX:-XX:G1ConcRfinementRedZone，的值进行重新计算
 	并行Refinement线程是持续运行的，并且会随着update log buffer 积累的数量而动态调节， 	
-XX:G1ConcRefinementGreenZone、-XX:G1ConcRfinementYellowZone、-XX:-XX:G1ConcRfinementRedZone，三个选项是用来根据不同的buffer使用不同的Refinement线程，其作用就是保证Refinement线程尽可能更上update
 log buffer生产的的步伐&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:GCTimeRatio=9 这个选项代表Java应用程序话费时间与GC线程花费时间的比率， 	1/(1+GCTimeRatio) 默认值是9 表示花费在GC工作量上的时间占总时间的10%&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+HeapDumpBeforeFullGC/-XX:+HeapDumpAfterFullGC 	启用此选项 ， 在Full 
GC开始之前有一个hprof文件会被创建， &amp;nbsp;	两个选项同时使用，可以对比Full GC前后的java堆内存，找出内存泄漏以及其他问题，&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:InitiatingHeapOccypancyPercent=45 该选项默认值是45 表示G1 
GC并行循环初始设置的堆大小值， 	这个值决定了一个并行循环是不是要开始执行， 
它的逻辑是在一次GC完成后，标胶老年代占用的空间和整个Java堆之间的比例，如果大于这个值，则预约下一次GC开始一个并行循环回收垃圾，从初始标记阶段开始。
 &amp;nbsp; 	这个值越小,GC 越频繁，反之 值越大，&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:UseStringDeduplication 该选项启动String对象的去重工作，默认不启用。 	如果启用该选项 String1.equals（String2） 如果两个对象包含相同的内容则返回true&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:StringDeduplicationAgeThreshold=3 &amp;nbsp;
针对-XX:UseStringDeduplication选项，默认值为3 &amp;nbsp;	字符串对象的年龄超过设定的阈值，或者提升到G1 
GC老年代Region之后，就会成为字符串去重的候选对象，去重操作只会有一次。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:PrintStringDeduplicationStatistics 可以通过读取输出的统计资料来了解是否字符串去重后节约了大量的堆内存空间，默认关闭&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+G1UseAdaptiveHOP JDK9的新选项 默认启用，通过动态调节标记阶段开始的时间，以达到提升应用程序吞吐量的目标， 	主要通过尽可能迟地触发标记循环方式来避免消耗老年代空间，&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:MaxGCPauseMills=200 【重要选项】设置G1的目标停顿时间 ，单位为ms 默认值为200ms&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:MinHeapFreeRatio=40 设置对内可以空闲的最小的内存空间大小，默认为堆内存的40% &amp;nbsp;	
当空闲堆内存大小小于此值的时候，需要判断-Xms 和 -Xmx 两个初始化设置值，如果-Xms 和 -Xmx 
不一样，那么就有机会扩展堆内存，否则就无法扩展。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-X:MaxHeapFreeRatio =70 这只最大空闲空间大小，默认为堆内存的70%，当大于这个空闲比率的时候 G1 GC 会自动减少对内存的大小， 需要判断-Xms 和 -Xmx的大小 如果两者一样则有机会减小堆内存，否则无法减小堆内存&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX：+PrintAdaptiveSizePolicy 这个选项决定是否开启堆内存大小变化的相应记录信息打印， 是否打印这些星系到GC日志里面&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+ResizePLAB GC使用的本地线程分配缓存块采用动态值还是静态值 默认开启 31. -XX:+ResizeTLAB Java线程使用的本地线程分配缓存块采用 动态值还是静态值。 默认开启&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+ClassUnloadingWithCncurrent 开启G1 
GC在并行循环卸载类，尤其是在老年代的并行回收阶段，默认是开启的。 &amp;nbsp;	这个选项开启后会在并行循环的重标记阶段卸载JVM没有用到的类， 
这些工作也可以放到Full GC 里面去做。是否开启此选项要看性价比。 
如果GC停顿时间比我们设置的最大GC停顿目标时间还长，并且需要卸载的类也不多，建议关闭此选项&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+ClassUnloading 默认是是True 决定JVM是否会卸载无用的类，如果关闭此选项，无论是并行回收循环还是Full GC 都不会再卸载这些类，所以需要谨慎关闭&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UnloadingDiagnosticVMOptions 是否开启诊断选项，默认值是 False&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UnlockExperimentalVMOptions 默认关闭&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;-XX:+UnlockCommercialFeatures &amp;nbsp;是都使用Oracle特有特性， 默认关闭&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;3-jvm常用调优分析工具&quot;&gt;3 JVM常用调优分析工具&lt;/h3&gt;&lt;p&gt;JVM内存分析调优，如果能多多利用调优的一些工具，那将会事半功倍。那么指北君问大家介绍比较好用的一些调优工具，包括Java自带的和第三方的一些好用工具。&lt;/p&gt;&lt;h5 id=&quot;jps&quot;&gt;jps&lt;/h5&gt;&lt;p&gt;JVM Process Status Tool，查询当前运行状态的Java 进程&lt;/p&gt;&lt;p&gt;语法格式&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;jps&amp;nbsp;[&amp;lt;options&amp;gt;]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;具体 [options]选项：
-q：仅输出VM标识列表；
-m：输出main方法的参数，输出可能为null；
-l：输出完整的包名，应用main calss，jar的完全路径名；
-v：输出JVM参数 ；
-V：输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 ；&lt;/p&gt;&lt;h5 id=&quot;jinfo&quot;&gt;jinfo&lt;/h5&gt;&lt;p&gt;JVM Configuration info ，查询Java进程运行时的详细信息以及JVM的参数详细信息&lt;/p&gt;&lt;p&gt;命令格式&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;jinfo&amp;nbsp;[&amp;nbsp;option&amp;nbsp;]&amp;nbsp;pidjinfo&amp;nbsp;[&amp;nbsp;option&amp;nbsp;]&amp;nbsp;executable&amp;nbsp;corejinfo&amp;nbsp;[&amp;nbsp;option&amp;nbsp;]&amp;nbsp;[server-id@]remote-hostname-or-IP&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;具体 [options]选项：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-flag&lt;/strong&gt; &lt;em&gt;name&lt;/em&gt; &amp;nbsp;： &amp;nbsp;prints the name and value of the given command line flag.&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td&gt;&lt;strong&gt;-flag&lt;/strong&gt; [+&lt;/td&gt;&lt;td&gt;-]name ： enables or disables the given boolean command line flag.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;-flag&lt;/strong&gt; name=value &amp;nbsp;： sets the given command line flag to the specified value.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-flags&lt;/strong&gt; prints ： command line flags passed to the JVM. pairs.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-sysprops&lt;/strong&gt; ：prints Java System properties as name, value pairs.&lt;/p&gt;&lt;p&gt;示例:&lt;/p&gt;&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;bin&amp;gt;jinfo&amp;nbsp;-flags&amp;nbsp;17876
VM&amp;nbsp;Flags:
-XX:CICompilerCount=2&amp;nbsp;-XX:ConcGCThreads=1&amp;nbsp;-XX:ErrorFile=C:\Users\Michael\java_error_in_idea64_%p.log&amp;nbsp;-XX:G1ConcRefinementThreads=4...&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;bin&amp;gt;jinfo&amp;nbsp;-flag&amp;nbsp;InitialHeapSize&amp;nbsp;17876-XX:InitialHeapSize=134217728&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h5 id=&quot;jstat&quot;&gt;jstat&lt;/h5&gt;&lt;p&gt;JVM Statistics Monitoring Tool &amp;nbsp;
可查看JVM的性能统计信息，能显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。可参考官网详情：https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html&lt;/p&gt;&lt;p&gt;命令格式&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;jstat&amp;nbsp;[&amp;nbsp;generalOption&amp;nbsp;|&amp;nbsp;outputOptions&amp;nbsp;vmid&amp;nbsp;[interval[s|ms]&amp;nbsp;[count]]&amp;nbsp;]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;generalOption 通用命令行参数，&lt;/p&gt;&lt;p&gt;outputOptions 一个过多个输出选项，&lt;/p&gt;&lt;p&gt;vmid 虚拟机定位标识，确定虚拟机运行的机器端口等&lt;/p&gt;&lt;p&gt;interval 查询并显示信息的时间间隔&lt;/p&gt;&lt;p&gt;count 需要查询信息的数量&lt;/p&gt;&lt;p&gt;关于jstat的参数选项有如：&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;Option&lt;/th&gt;&lt;th&gt;Displays…&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#class_option&quot;&gt;class&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics on the behavior of the class loader.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#compiler_option&quot;&gt;compiler&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics of the behavior of the HotSpot Just-in-Time compiler.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gc_option&quot;&gt;gc&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics of the behavior of the garbage collected heap.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gccapacity_option&quot;&gt;gccapacity&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics of the capacities of the generations and their corresponding spaces.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gccause_option&quot;&gt;gccause&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Summary of garbage collection statistics (same as &lt;strong&gt;-gcutil&lt;/strong&gt;), with the cause of the last and current (if applicable) garbage collection events.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gcnew_option&quot;&gt;gcnew&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics of the behavior of the new generation.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gcnewcapacity_option&quot;&gt;gcnewcapacity&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics of the sizes of the new generations and its corresponding spaces.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gcold_option&quot;&gt;gcold&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics of the behavior of the old and permanent generations.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gcoldcapacity_option&quot;&gt;gcoldcapacity&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics of the sizes of the old generation.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gcpermcapacity_option&quot;&gt;gcpermcapacity&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Statistics of the sizes of the permanent generation.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gcutil_option&quot;&gt;gcutil&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Summary of garbage collection statistics.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#printcompilation_option&quot;&gt;printcompilation&lt;/a&gt;&lt;/td&gt;&lt;td&gt;HotSpot compilation method statistics.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;width: 1058px;&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;bin&amp;gt;jstat&amp;nbsp;-gcoldcapacity&amp;nbsp;-t&amp;nbsp;17876&amp;nbsp;250&amp;nbsp;3Timestamp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OGCMN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OGCMX&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OGC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;YGC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FGC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FGCT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGCT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GCT
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6378.7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1042432.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;505856.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;505856.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;310&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.000&amp;nbsp;&amp;nbsp;&amp;nbsp;134&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.033&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7.305
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6379.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1042432.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;505856.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;505856.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;310&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.000&amp;nbsp;&amp;nbsp;&amp;nbsp;134&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.033&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7.305
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6379.3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1042432.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;505856.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;505856.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;310&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.000&amp;nbsp;&amp;nbsp;&amp;nbsp;134&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.033&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7.305&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h5 id=&quot;jmap&quot;&gt;jmap&lt;/h5&gt;&lt;p&gt;JVM Memory Map 输出对象内存信息，Java堆信息等&lt;/p&gt;&lt;p&gt;命令格式&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;jmap&amp;nbsp;[&amp;nbsp;option&amp;nbsp;]&amp;nbsp;pidjmap&amp;nbsp;[&amp;nbsp;option&amp;nbsp;]&amp;nbsp;executable&amp;nbsp;corejmap&amp;nbsp;[&amp;nbsp;option&amp;nbsp;]&amp;nbsp;[server-id@]remote-hostname-or-IP&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;options选项&lt;/p&gt;&lt;p&gt;**-dump:[live,]format=b,file=** &amp;nbsp;将Java堆生成dump文件，&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-finalizerinfo&lt;/strong&gt; 输出等待执行finalizer方法的对象&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-heap&lt;/strong&gt; 输出堆的详细信息，GC算法，堆参数等等&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-histo[:live]&lt;/strong&gt; 输出堆的统计信息，包括Java类，对象数量，内存size等&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-permstat&lt;/strong&gt; Prints class loader wise statistics of permanent generation of Java heap&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-F&lt;/strong&gt; 强制生成dump，与jmap -dump / jmap -histo 等一起使用，如果进程id没有响应则强制生成dump文件&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;bin&amp;gt;jmap&amp;nbsp;-finalizerinfo&amp;nbsp;17876No&amp;nbsp;instances&amp;nbsp;waiting&amp;nbsp;for&amp;nbsp;finalization&amp;nbsp;found&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;生成Java 堆dump文件&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;bin&amp;gt;jmap&amp;nbsp;-dump:format=b,file=E:/Java/heap/17876.hprof&amp;nbsp;17876Heap&amp;nbsp;dump&amp;nbsp;file&amp;nbsp;created&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h5 id=&quot;jstack&quot;&gt;jstack&lt;/h5&gt;&lt;p&gt;主要输出 Java线程的堆栈信息&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;jstack&amp;nbsp;[options]&amp;nbsp;pid&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;bin&amp;gt;jstack&amp;nbsp;-l&amp;nbsp;17876&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h5 id=&quot;jconsole&quot;&gt;JConsole&lt;/h5&gt;&lt;p&gt;JConsole 是Java自带的可视化程序，可以监控一些内存线程等信息，使用也比较方便。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2021/07/20210728170832_32395.png&quot; alt=&quot;image-20210620144950996&quot;/&gt;&lt;/p&gt;&lt;h5 id=&quot;visualvm&quot;&gt;VisualVM&lt;/h5&gt;&lt;p&gt;VisualVM在在Java8之后就被从JDK中拿走，如果想使用可以去VisualVM官网（文末贴出下载地址）下载，它有标准版和基于GraalVM的版本，同时还有IDEA的插件用起来也比较方便。我们下载标准版VisualVM2.07先看一下。还是熟悉的味道。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2021/07/20210728170833_64378.png&quot; alt=&quot;image-20210620152404975&quot;/&gt;&lt;/p&gt;&lt;h5 id=&quot;memory-analyzer-mat&quot;&gt;Memory Analyzer (MAT)&lt;/h5&gt;&lt;p&gt;Eclipse 出品的一款Java堆内存分析程序，可以帮助我们找到内存泄漏和减少内存消耗。可在其官网下载，文末贴出下载地址&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blogcenter.cn/zb_users/upload/2021/07/20210728170836_15451.png&quot; alt=&quot;image-20210620163203561&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;总结&quot;&gt;总结&lt;/h3&gt;&lt;p&gt;本篇总结了一些常用GC的垃圾回收流程，GC调优可以参考的一些参数。另外还介绍了一些分析Java性能的一下Java命令及可视化分析工具，在实际生产环境使用的话肯定会比所介绍的还要复杂，所以看官们还不快快动起手来操练一下。让你的JVM不再寂寞。由于每一个工具的详细使用都需要大篇幅，那么指北君后面将会为大家一一带来这些工具如何进行JVM性能调优。敬请期待！&lt;/p&gt;&lt;h3 id=&quot;后记&quot;&gt;后记&lt;/h3&gt;&lt;p&gt;VisualVM 官网 ：https://visualvm.github.io/&lt;/p&gt;&lt;p&gt;GraalVM 官网 ： https://www.graalvm.org/&lt;/p&gt;&lt;p&gt;Memory Analyzer (MAT) 下载 官网： https://www.eclipse.org/mat/downloads.php （选择国内中科大的镜像，下载会快许多）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 28 Jul 2021 17:07:40 +0800</pubDate></item><item><title>java博客推荐</title><link>http://blogcenter.cn/?id=245</link><description>&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;程序员一站导航&lt;br/&gt;&lt;/p&gt;&lt;p&gt;http://www.cxy521.com/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;java技术指北：&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.javanorth.cn/&quot; _src=&quot;https://www.javanorth.cn/&quot;&gt;https://www.javanorth.cn/&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;http://www.ityouknow.com/spring-cloud.html&lt;/p&gt;&lt;p&gt;http://www.ityouknow.com/spring-boot.html&lt;/p&gt;</description><pubDate>Wed, 28 Jul 2021 16:19:12 +0800</pubDate></item></channel></rss><!--21.38 ms , 5 query , 1984kb memory , 0 error-->