Files
cool-admin-java-docs/.vitepress/dist/src/guide/plugin.html
T
2025-04-13 10:51:35 +08:00

261 lines
98 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en-US" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>扩展插件 | Cool Admin</title>
<meta name="description" content="一个很酷的后台管理系统开发框架">
<meta name="generator" content="VitePress v1.6.3">
<link rel="preload stylesheet" href="/assets/style.BaGxxT1-.css" as="style">
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
<script type="module" src="/assets/app.CO6Yq8ZF.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/assets/chunks/theme.BG3pNQ3U.js">
<link rel="modulepreload" href="/assets/chunks/framework.BjhQB2K5.js">
<link rel="modulepreload" href="/assets/src_guide_plugin.md.DSQp6REO.lean.js">
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-96d1ba1f data-v-fbfa64bf><!--[--><!--]--><!--[--><span tabindex="-1" data-v-5d3e946a></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-5d3e946a>Skip to content</a><!--]--><!----><header class="VPNav" data-v-fbfa64bf data-v-1f7b0f5c><div class="VPNavBar has-sidebar top" data-v-1f7b0f5c data-v-511c2cc9><div class="wrapper" data-v-511c2cc9><div class="container" data-v-511c2cc9><div class="title" data-v-511c2cc9><div class="VPNavBarTitle has-sidebar" data-v-511c2cc9 data-v-211643ab><a class="title" href="/" data-v-211643ab><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.png" alt data-v-4d0b3a1f><!--]--><span data-v-211643ab>Cool Admin</span><!--[--><!--]--></a></div></div><div class="content" data-v-511c2cc9><div class="content-body" data-v-511c2cc9><!--[--><!--]--><div class="VPNavBarSearch search" data-v-511c2cc9><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-511c2cc9 data-v-d53bf4df><span id="main-nav-aria-label" class="visually-hidden" data-v-d53bf4df> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/src/introduce/index.html" tabindex="0" data-v-d53bf4df data-v-bbf7f74d><!--[--><span data-v-bbf7f74d>介绍</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/src/guide/quick.html" tabindex="0" data-v-d53bf4df data-v-bbf7f74d><!--[--><span data-v-bbf7f74d>教程</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://cool-js.com/plugin" target="_blank" rel="noreferrer" tabindex="0" data-v-d53bf4df data-v-bbf7f74d><!--[--><span data-v-bbf7f74d>🔥插件市场</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/src/about/index.html" tabindex="0" data-v-d53bf4df data-v-bbf7f74d><!--[--><span data-v-bbf7f74d>交流合作</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-d53bf4df data-v-95325d79><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-95325d79><span class="text" data-v-95325d79><!----><span data-v-95325d79>v7.1.0</span><span class="vpi-chevron-down text-icon" data-v-95325d79></span></span></button><div class="menu" data-v-95325d79><div class="VPMenu" data-v-95325d79 data-v-3e022afb><div class="items" data-v-3e022afb><!--[--><!--[--><div class="VPMenuLink" data-v-3e022afb data-v-acee1e57><a class="VPLink link" href="/src/todo/update.html" data-v-acee1e57><!--[--><span data-v-acee1e57>更新日志</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-3e022afb data-v-acee1e57><a class="VPLink link" href="/src/todo/plan.html" data-v-acee1e57><!--[--><span data-v-acee1e57>版本计划</span><!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-d53bf4df data-v-95325d79><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-95325d79><span class="text" data-v-95325d79><!----><span data-v-95325d79>更多</span><span class="vpi-chevron-down text-icon" data-v-95325d79></span></span></button><div class="menu" data-v-95325d79><div class="VPMenu" data-v-95325d79 data-v-3e022afb><div class="items" data-v-3e022afb><!--[--><!--[--><div class="VPMenuLink" data-v-3e022afb data-v-acee1e57><a class="VPLink link vp-external-link-icon" href="https://cool-js.com" target="_blank" rel="noreferrer" data-v-acee1e57><!--[--><span data-v-acee1e57>Cool 官网</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-3e022afb data-v-acee1e57><a class="VPLink link vp-external-link-icon" href="https://node.cool-admin.com" target="_blank" rel="noreferrer" data-v-acee1e57><!--[--><span data-v-acee1e57>Cool Admin(Nodejs版)</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-3e022afb data-v-acee1e57><a class="VPLink link vp-external-link-icon" href="https://node.cool-js.com" target="_blank" rel="noreferrer" data-v-acee1e57><!--[--><span data-v-acee1e57>Cool Admin Vue(前端)</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-3e022afb data-v-acee1e57><a class="VPLink link vp-external-link-icon" href="https://uni-docs.cool-js.com" target="_blank" rel="noreferrer" data-v-acee1e57><!--[--><span data-v-acee1e57>Uni(基于uni-app跨端移动端开发)</span><!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-511c2cc9 data-v-764c0058><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="切换到深色模式" aria-checked="false" data-v-764c0058 data-v-ae950ac5 data-v-4ec3b2fe><span class="check" data-v-4ec3b2fe><span class="icon" data-v-4ec3b2fe><!--[--><span class="vpi-sun sun" data-v-ae950ac5></span><span class="vpi-moon moon" data-v-ae950ac5></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-511c2cc9 data-v-d6e28fe5 data-v-c9b9e435><!--[--><a class="VPSocialLink no-icon" href="https://github.com/cool-team-official/cool-admin-java" aria-label="github" target="_blank" rel="noopener" data-v-c9b9e435 data-v-71029e87><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-511c2cc9 data-v-cc85dc96 data-v-95325d79><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-95325d79><span class="vpi-more-horizontal icon" data-v-95325d79></span></button><div class="menu" data-v-95325d79><div class="VPMenu" data-v-95325d79 data-v-3e022afb><!----><!--[--><!--[--><!----><div class="group" data-v-cc85dc96><div class="item appearance" data-v-cc85dc96><p class="label" data-v-cc85dc96>主题</p><div class="appearance-action" data-v-cc85dc96><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="切换到深色模式" aria-checked="false" data-v-cc85dc96 data-v-ae950ac5 data-v-4ec3b2fe><span class="check" data-v-4ec3b2fe><span class="icon" data-v-4ec3b2fe><!--[--><span class="vpi-sun sun" data-v-ae950ac5></span><span class="vpi-moon moon" data-v-ae950ac5></span><!--]--></span></span></button></div></div></div><div class="group" data-v-cc85dc96><div class="item social-links" data-v-cc85dc96><div class="VPSocialLinks social-links-list" data-v-cc85dc96 data-v-c9b9e435><!--[--><a class="VPSocialLink no-icon" href="https://github.com/cool-team-official/cool-admin-java" aria-label="github" target="_blank" rel="noopener" data-v-c9b9e435 data-v-71029e87><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-511c2cc9 data-v-e08ccaba><span class="container" data-v-e08ccaba><span class="top" data-v-e08ccaba></span><span class="middle" data-v-e08ccaba></span><span class="bottom" data-v-e08ccaba></span></span></button></div></div></div></div><div class="divider" data-v-511c2cc9><div class="divider-line" data-v-511c2cc9></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-fbfa64bf data-v-3eeb2970><div class="container" data-v-3eeb2970><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-3eeb2970><span class="vpi-align-left menu-icon" data-v-3eeb2970></span><span class="menu-text" data-v-3eeb2970>菜单</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-3eeb2970 data-v-bd1fb31f><button data-v-bd1fb31f>回到顶部</button><!----></div></div></div><aside class="VPSidebar" data-v-fbfa64bf data-v-130e406e><div class="curtain" data-v-130e406e></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-130e406e><span class="visually-hidden" id="sidebar-aria-label" data-v-130e406e> Sidebar Navigation </span><!--[--><!--[--><div class="ad" data-v-96d1ba1f><!--[--><!--]--></div><!--]--><!--]--><!--[--><div class="no-transition group" data-v-7eb7a422><section class="VPSidebarItem level-0" data-v-7eb7a422 data-v-6092ddf2><div class="item" role="button" tabindex="0" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><h2 class="text" data-v-6092ddf2>介绍</h2><!----></div><div class="items" data-v-6092ddf2><!--[--><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/introduce/index.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>简介</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/introduce/show.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>演示</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/introduce/src.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>源码</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-7eb7a422><section class="VPSidebarItem level-0 has-active" data-v-7eb7a422 data-v-6092ddf2><div class="item" role="button" tabindex="0" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><h2 class="text" data-v-6092ddf2>教程</h2><!----></div><div class="items" data-v-6092ddf2><!--[--><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/quick.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>快速开始</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/dir.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>目录结构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/ai.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>Ai编码</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/flow.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>Ai流程编排</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/plugin.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>扩展插件</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/dev.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>开发方式</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1" data-v-6092ddf2 data-v-6092ddf2><div class="item" role="button" tabindex="0" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><h3 class="text" data-v-6092ddf2>核心</h3><!----></div><div class="items" data-v-6092ddf2><!--[--><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/controller.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>控制器(controller)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/service.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>服务(service)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/db.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>数据库(db)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/cache.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>缓存(cache)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/upload.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>文件上传(file)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/exception.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>统一异常(exception)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/security.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>权限校验(security)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/initData.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>数据初始化(init)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/uniqueIDGen.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>分布式ID(id)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/lock.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>锁(lock)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/noRepeatSubmit.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>防重提交(submit)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/recordLog.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>请求日志(log)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/swagger.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>接口文档(swagger)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/tenant.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>多租户(tenant)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/i18n.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>国际化多语言(i18n)</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/guide/deploy.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>部署项目</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-7eb7a422><section class="VPSidebarItem level-0" data-v-7eb7a422 data-v-6092ddf2><div class="item" role="button" tabindex="0" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><h2 class="text" data-v-6092ddf2>计划&更新</h2><!----></div><div class="items" data-v-6092ddf2><!--[--><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/todo/update.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>更新</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/todo/plan.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>计划</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-7eb7a422><section class="VPSidebarItem level-0" data-v-7eb7a422 data-v-6092ddf2><!----><div class="items" data-v-6092ddf2><!--[--><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/question/common.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>常见问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-6092ddf2 data-v-6092ddf2><div class="item" data-v-6092ddf2><div class="indicator" data-v-6092ddf2></div><a class="VPLink link link" href="/src/about/index.html" data-v-6092ddf2><!--[--><p class="text" data-v-6092ddf2>交流合作</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-fbfa64bf data-v-8d143afd><div class="VPDoc has-sidebar has-aside" data-v-8d143afd data-v-4d316cbc><!--[--><!--]--><div class="container" data-v-4d316cbc><div class="aside" data-v-4d316cbc><div class="aside-curtain" data-v-4d316cbc></div><div class="aside-container" data-v-4d316cbc><div class="aside-content" data-v-4d316cbc><div class="VPDocAside" data-v-4d316cbc data-v-c4200bf2><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-c4200bf2 data-v-beb6bc9f><div class="content" data-v-beb6bc9f><div class="outline-marker" data-v-beb6bc9f></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-beb6bc9f>页面导航</div><ul class="VPDocOutlineItem root" data-v-beb6bc9f data-v-c8fd7940><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-c4200bf2></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-4d316cbc><div class="content-container" data-v-4d316cbc><!--[--><!--]--><main class="main" data-v-4d316cbc><div style="position:relative;" class="vp-doc _src_guide_plugin" data-v-4d316cbc><div><h1 id="扩展插件" tabindex="-1">扩展插件 <a class="header-anchor" href="#扩展插件" aria-label="Permalink to &quot;扩展插件&quot;">​</a></h1><p>为了丰富系统功能,我们提供了插件系统,可以通过插件的方式来扩展系统功能。</p><p>而不用一味地堆功能,导致系统臃肿。你可以自己开发插件,也可以使用别人开发的插件。</p><p><a href="https://cool-js.com/plugin" target="_blank" rel="noreferrer">点击前往插件市场</a></p><h2 id="使用插件" tabindex="-1">使用插件 <a class="header-anchor" href="#使用插件" aria-label="Permalink to &quot;使用插件&quot;">​</a></h2><h3 id="_1、安装" tabindex="-1">1、安装 <a class="header-anchor" href="#_1、安装" aria-label="Permalink to &quot;1、安装&quot;">​</a></h3><p>首先下载插件包,然后在系统中安装插件包。插件包可以通过官网<a href="https://cool-js.com/plugin" target="_blank" rel="noreferrer">下载插件</a>。</p><p>打开后台管理系统,点击左侧菜单<code>扩展管理</code>/<code>插件管理</code>,点击+按钮,选择插件包进行安装。</p><p><img src="/guide/plugin-install.gif" alt=""></p><h3 id="_2、调用" tabindex="-1">2、调用 <a class="header-anchor" href="#_2、调用" aria-label="Permalink to &quot;2、调用&quot;">​</a></h3><p>安装插件之后,就可以在代码中调用插件的方法了。</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">package</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> com.cool.core.base.controller;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cn.hutool.core.util.ObjUtil;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> com.cool.core.util.CoolPluginInvokers;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> lombok.RequiredArgsConstructor;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> org.springframework.stereotype.Controller;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> org.springframework.web.bind.annotation.PostMapping;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> org.springframework.web.bind.annotation.RequestMapping;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> org.springframework.web.bind.annotation.RequestParam;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> org.springframework.web.bind.annotation.ResponseBody;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">Controller</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">RequiredArgsConstructor</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> CommonController</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">PostMapping</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;/testPlugin/invokeMethod&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">ResponseBody</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> public</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> String </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">invokeMethod</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">RequestParam</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> String </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">key</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">RequestParam</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> String </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">methodName</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Object result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (ObjUtil.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">isEmpty</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(methodName)) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CoolPluginInvokers.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">invokePlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(key);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CoolPluginInvokers.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">invokePlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(key, methodName);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(result);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;invokeMethod Result: &quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> result;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>运行结果</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>2024-07-13T20:01:18.543+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.util.CoolPluginInvokers : 调用插件类: test, 方法: invokePlugin 参数: []</span></span>
<span class="line"><span>Hello invokePlugin</span></span>
<span class="line"><span>2024-07-13T20:01:18.543+08:00 DEBUG 32615 --- [cool-admin-java] [ task-5] c.c.m.b.m.sys.BaseSysLogMapper.insert : ==&gt; Preparing: INSERT INTO `base_sys_log`(`action`, `ip`, `params`, `create_time`, `update_time`) VALUES (?, ?, ?, now(), now())</span></span>
<span class="line"><span>2024-07-13T20:01:18.544+08:00 DEBUG 32615 --- [cool-admin-java] [ task-5] c.c.m.b.m.sys.BaseSysLogMapper.insert : ==&gt; Parameters: /testPlugin/invokeMethod(String), 127.0.0.1(String), {&quot;key&quot;:&quot;test&quot;}(String)</span></span>
<span class="line"><span>2024-07-13T20:01:18.554+08:00 DEBUG 32615 --- [cool-admin-java] [ task-5] c.c.m.b.m.sys.BaseSysLogMapper.insert : &lt;== Updates: 1</span></span>
<span class="line"><span>2024-07-13T20:01:18.557+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.plugin.BaseCoolPlugin : 调用主应用: coolCache, 方法: set</span></span>
<span class="line"><span>2024-07-13T20:01:18.558+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.plugin.BaseCoolPlugin : 调用主应用: coolCache, 方法: get</span></span>
<span class="line"><span>缓存结果:一个项目用COOL就够了</span></span>
<span class="line"><span>2024-07-13T20:01:18.559+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.plugin.BaseCoolPlugin : 调用主应用: coolPluginService, 方法: getInstance</span></span>
<span class="line"><span>2024-07-13T20:01:18.564+08:00 INFO 32615 --- [cool-admin-java] [nio-8001-exec-5] com.cool.core.plugin.BaseCoolPlugin : 调用其他插件aliyun-oss, 方法: invokePlugin</span></span>
<span class="line"><span>{OSSAccessKeyId=LTAI5t8xtPD99YzSJQCC, signature=krlJ0Uv96TBliAgPJI/KyI=, success_action_status=200, host=https://xxx.oss-cn-hangzhou.aliyuncs.com, policy=eyJleHB0wNy0xM1QxMjowMTo0OC41NjVaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsNTI0Mjg4MDBdXX0=}</span></span>
<span class="line"><span> ______ ___ ___ _____ _ ______ ____ ____ _____ ____ _____</span></span>
<span class="line"><span> .&#39; ___ | .&#39; `. .&#39; `.|_ _| V7.x / \ |_ _ `.|_ \ / _||_ _||_ \|_ _|</span></span>
<span class="line"><span>/ .&#39; \_|/ .-. \/ .-. \ | | ______ / _ \ | | `. \ | \/ | | | | \ | |</span></span>
<span class="line"><span>| | | | | || | | | | | _|______|/ ___ \ | | | | | |\ /| | | | | |\ \| |</span></span>
<span class="line"><span>\ `.___.&#39;\\ `-&#39; /\ `-&#39; /_| |__/ | _/ / \ \_ _| |_.&#39; /_| |_\/_| |_ _| |_ _| |_\ |_</span></span>
<span class="line"><span> `.____ .&#39; `.___.&#39; `.___.&#39;|________| |____| |____||______.&#39;|_____||_____||_____||_____|\____|</span></span>
<span class="line"><span>:: https://java.cool-admin.com ::</span></span>
<span class="line"><span>Hello invokePlugin</span></span></code></pre></div><p>对应插件内的方法</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">package</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> com.cool.plugin;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cn.hutool.core.io.IoUtil;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cn.hutool.core.util.StrUtil;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> com.cool.core.annotation.CoolPlugin;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> com.cool.core.plugin.BaseCoolPlugin;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> java.io.InputStream;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> lombok.extern.slf4j.Slf4j;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 类必须要有 @CoolPlugin 注解,一个插件jar有且只能有一个类被 @CoolPlugin 注解</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 类必须继承 BaseCoolPlugin, 并实现 invokePlugin</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 插件方法</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">Slf4j</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">CoolPlugin</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MyCoolPlugin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> BaseCoolPlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> public</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Object </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">invokePlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(String... </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">params</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Hello invokePlugin&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> useCache</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> usePlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> getParentResource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;Hello invokePlugin&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 使用缓存,使用cool-admin的缓存,开发的时候只是模拟</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> private</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> useCache</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 调用主应用设置缓存</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> invokeMain</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;coolCache&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;set&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;a&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;一个项目用COOL就够了&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 调用主应用获取缓存</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Object cache </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> invokeMain</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;coolCache&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;get&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;a&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;缓存结果:&quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cache);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 调用其他插件</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> private</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> usePlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 获得其他插件,开发的时候无法调试,只有安装到cool-admin中才能调试 xxx 为插件key</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Object result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> invokeOtherPlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;aliyun-oss&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;invokePlugin&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(result);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 获取主应用resources目录下的资源文件</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> private</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> getParentResource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ClassLoader classLoader </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> getClass</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getClassLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ClassLoader parentClassLoader </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> classLoader.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getParent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 获取主应用resources下的 banner.txt 文件内容</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> InputStream inputStream </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> parentClassLoader.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getResourceAsStream</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;banner.txt&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(StrUtil.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(IoUtil.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">readBytes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(inputStream), </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;UTF-8&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">));</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>其中我们可以在插件包里通过 invokeMain 方法去调用主应用的一些对象方法</p><p>比如 coolCache 缓存对象, 通过反射实现</p><p>在加载 jar 包时会想该插件注入 ApplicationContext,使得可以在插件中获取主应用中的 bean</p><h3 id="_3、配置" tabindex="-1">3、配置 <a class="header-anchor" href="#_3、配置" aria-label="Permalink to &quot;3、配置&quot;">​</a></h3><p>有时候开发时的配置和生产环境的配置是不一样的,我们可以通过配置文件来实现。</p><p>例如原本的配置文件是这样的</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;appId&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;xxxxx&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;appSecret&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;xxxxx&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;filePath&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;banner.txt&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>其中 banner.txt 为主应用 resources 资源目录下的文件,路径可以自己指定,范围在 resources 下</p><h2 id="开发插件" tabindex="-1">开发插件 <a class="header-anchor" href="#开发插件" aria-label="Permalink to &quot;开发插件&quot;">​</a></h2><h3 id="_1、脚手架" tabindex="-1">1、脚手架 <a class="header-anchor" href="#_1、脚手架" aria-label="Permalink to &quot;1、脚手架&quot;">​</a></h3><p>为了方便开发插件和统一插件开发规范,我们提供了插件脚手架,可以快速开发我们的插件。</p><p>脚手架源码仓库:</p><p><a href="https://github.com/cool-team-official/cool-admin-java-plugin" target="_blank" rel="noreferrer">https://github.com/cool-team-official/cool-admin-java-plugin</a></p><p>或</p><p><a href="https://gitee.com/cool-team-official/cool-admin-java-plugin" target="_blank" rel="noreferrer">https://gitee.com/cool-team-official/cool-admin-java-plugin</a></p><h3 id="_2、目录结构" tabindex="-1">2、目录结构 <a class="header-anchor" href="#_2、目录结构" aria-label="Permalink to &quot;2、目录结构&quot;">​</a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>.</span></span>
<span class="line"><span>main</span></span>
<span class="line"><span>├─ java</span></span>
<span class="line"><span>│ └─ com.cool</span></span>
<span class="line"><span>│ ├─core 核心包</span></span>
<span class="line"><span>│ │ ├─ annotation</span></span>
<span class="line"><span>│ │ └─ ...</span></span>
<span class="line"><span>│ └─ plugin</span></span>
<span class="line"><span>│ └─ MyCoolPlugin 插件包,插件类放在这个包下,在打包的时候选择要打包的插件,加上@CoolPlugin注解</span></span>
<span class="line"><span>├─ resources</span></span>
<span class="line"><span>│ └─ plugin.json 插件信息配置文件</span></span>
<span class="line"><span>test</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>│─ java</span></span>
<span class="line"><span>│ └─ com.cool.plugin</span></span>
<span class="line"><span>│ └─ MyCoolPluginTest 插件运行测试类</span></span></code></pre></div><h3 id="_3、开发过程" tabindex="-1">3、开发过程 <a class="header-anchor" href="#_3、开发过程" aria-label="Permalink to &quot;3、开发过程&quot;">​</a></h3><ul><li>配置插件信息(plugin.json)</li></ul><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;测试&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;key&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;demo-plugin&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;hook&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;version&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;1.0.0&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;description&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;插件描述&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;author&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;作者&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;logo&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;assets/logo.png&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;readme&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;assets/README.md&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;config&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;aaa&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;xxx&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;bbb&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;xxx&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>config 是插件的配置信息,不同的插件有不同的配置,上面只是个例子,实际开发中可以根据自己的需求来配置,在后台插件管理里可以动态修改</p><h3 id="_4、字段解释" tabindex="-1">4、字段解释 <a class="header-anchor" href="#_4、字段解释" aria-label="Permalink to &quot;4、字段解释&quot;">​</a></h3><table tabindex="0"><thead><tr><th>字段</th><th>说明</th></tr></thead><tbody><tr><td>name</td><td>角色数组</td></tr><tr><td>key</td><td>插件唯一标识</td></tr><tr><td>hook</td><td>插件钩子,比如替换系统的上传组件,upload</td></tr><tr><td>version</td><td>版本号</td></tr><tr><td>description</td><td>插件描述</td></tr><tr><td>author</td><td>作者</td></tr><tr><td>logo</td><td>插件 logo,建议尺寸 256x256</td></tr><tr><td>readme</td><td>插件介绍,会展示在插件的详情中</td></tr><tr><td>config</td><td>插件配置, 每个插件的配置各不相同</td></tr></tbody></table><h2 id="插件详解" tabindex="-1">插件详解 <a class="header-anchor" href="#插件详解" aria-label="Permalink to &quot;插件详解&quot;">​</a></h2><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">package</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> com.cool.plugin;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> com.cool.core.annotation.CoolPlugin;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> com.cool.core.plugin.BaseCoolPlugin;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> net.sourceforge.pinyin4j.PinyinHelper;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> net.sourceforge.pinyin4j.format.HanyuPinyinToneType;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 类必须要有 @CoolPlugin 注解,一个插件jar有且只能有一个类被 @CoolPlugin 注解</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 类必须继承 BaseCoolPlugin</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">CoolPlugin</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> DemoCoolPlugin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> BaseCoolPlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> public</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Object </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">invokePlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(String... </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">params</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> String chineseChar </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> params[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 汉字字符</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> HanyuPinyinOutputFormat format </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HanyuPinyinOutputFormat</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> format.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">setToneType</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(HanyuPinyinToneType.WITHOUT_TONE); </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 不带声调</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> String pinyin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pinyin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PinyinHelper.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">toHanyuPinyinString</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(chineseChar, format, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (BadHanyuPinyinOutputFormatCombination </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">e</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> throw</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> RuntimeException</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(e);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;汉字:&quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> chineseChar </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;,拼音:&quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pinyin);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Object cache </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> invokeMain</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;coolCache&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;get&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;verify:img:4fd03504-47ac-4b57-b8e4-3c64059230d0&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> String.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">format</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;hello,%s 我是插件&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, chineseChar);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><ul><li>类必须要有 @CoolPlugin 注解,一个插件 jar 有且只能有一个类被 @CoolPlugin 注解</li><li>类必须继承 BaseCoolPlugin, 并实现 invokePlugin 插件方法 满足以上条件,在插件导入时才能被识别到。<br> 在提供的插件脚手架中已经应用了常用的依赖如 hutool 等<br> 在开发过程中如果需要引入第三方类库,可使用 maven 引入依赖,如我们这边示例使用到了中文转拼音</li></ul><div class="language-xml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;cn.hutool&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;hutool-all&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;5.8.26&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">&lt;!--***以上包在主应用已经引入,避免插件过大不会在打入jar包中***--&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">&lt;!--***为了开发插件如果引入了主应用已经有的maven依赖可以在下面的 maven-shade-plugin 中排除掉不打入jar***--&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">&lt;!--以下包会打入jar,主应用没有这些依赖,不然调用时会报错--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;com.belerweb&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;pinyin4j&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;2.5.0&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span></code></pre></div><p>在我们脚手架上你可以发现,我们还引入了其他包 springframework、hutool 等,这会使得打包结果很臃肿,这边使用到了 maven-shade-plugin maven 插件可以在打包的时候将在我们 cool-admin-java 主应用项目已经有的依赖给排除掉,避免打包结果过大</p><div class="language-xml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">&lt;!--***为了开发插件如果引入了主应用已经有的maven依赖可以在下面的 maven-shade-plugin 中排除掉不打入jar***--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">plugins</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">plugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.apache.maven.plugins&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;maven-shade-plugin&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;3.2.4&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">executions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">execution</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">phase</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;package&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">phase</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">goals</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">goal</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;shade&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">goal</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">goals</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifactSet</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">excludes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> &lt;!--主应用以有这些依赖,打包时可以排除--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.springframework:spring-beans&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.springframework:spring-core&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.springframework:spring-jcl&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.springframework:spring-context&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.springframework:spring-aop&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.springframework:spring-expression&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;io.micrometer:micrometer-observation:jar&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;io.micrometer:micrometer-commons:jar&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;jakarta.annotation:jakarta.annotation-api&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.slf4j:slf4j-api&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.projectlombok:lombok&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;cn.hutool:hutool-core&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;cn.hutool:hutool-json&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;org.springframework:spring-beans&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;io.micrometer:micrometer-observation&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;io.micrometer:micrometer-commons&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">exclude</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">excludes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifactSet</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">execution</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">executions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">plugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">plugins</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span></code></pre></div><p>在执行打包的过程,可以在打包日志中查看我们排除和引入了哪些包</p><ul><li>Including 为引入</li><li>Excluding 为排除引入</li></ul><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>[INFO] --- maven-shade-plugin:3.2.4:shade (default) @ cool-admin-java-plugin ---</span></span>
<span class="line"><span>[INFO] Including com.belerweb:pinyin4j:jar:2.5.0 in the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding org.springframework:spring-beans:jar:6.1.6 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding org.springframework:spring-core:jar:6.1.6 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding org.springframework:spring-jcl:jar:6.1.6 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding org.springframework:spring-context:jar:6.1.6 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding org.springframework:spring-aop:jar:6.1.6 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding org.springframework:spring-expression:jar:6.1.6 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding io.micrometer:micrometer-observation:jar:1.12.5 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding io.micrometer:micrometer-commons:jar:1.12.5 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding jakarta.annotation:jakarta.annotation-api:jar:2.1.1 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding org.slf4j:slf4j-api:jar:2.0.13 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding org.projectlombok:lombok:jar:1.18.32 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding cn.hutool:hutool-core:jar:5.8.26 from the shaded jar.</span></span>
<span class="line"><span>[INFO] Excluding cn.hutool:hutool-json:jar:5.8.26 from the shaded jar.</span></span></code></pre></div><h2 id="打包" tabindex="-1">打包 <a class="header-anchor" href="#打包" aria-label="Permalink to &quot;打包&quot;">​</a></h2><p>打包命令</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>mvn clean package</span></span></code></pre></div><p>打包结果, 在 target 目录下 .cool 后缀的文件,就是我们的插件包</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>target/cool-admin-java-plugin-1.0-SNAPSHOT.cool</span></span></code></pre></div><p>其中对应的包名称 可在 pom.xml 中的 properties 里指定</p><div class="language-xml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">properties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">cool.plugin.name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;my_cool_plugin&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">cool.plugin.name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">properties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span></code></pre></div><p>最终打出的包为: my_cool_plugin.cool</p><h2 id="安装插件" tabindex="-1">安装插件 <a class="header-anchor" href="#安装插件" aria-label="Permalink to &quot;安装插件&quot;">​</a></h2><p>在后台插件管理页面,安装插件将打包好的.cool 文件上传。</p><h2 id="实现原理" tabindex="-1">实现原理 <a class="header-anchor" href="#实现原理" aria-label="Permalink to &quot;实现原理&quot;">​</a></h2><ul><li><p>动态加载 Jar 包</p><blockquote><p>实现动态加载的技术方案<br> 在 SpringBoot 中实现动态加载 Jar 包: URLClassLoader 是 Java 标准库中提供的一个类加载器,它可以加载指定的 URL 资源,包括本地文件系统、远程服务器和 JAR 文件等。<br> 通过 URLClassLoader,我们可以在运行时动态地加载外部的 Jar 包或类。</p></blockquote></li><li><p>优势:</p><blockquote><p>1、灵活性高:可以动态指定 Jar 包的位置和版本。<br> 2、可控性强:可以通过代码控制加载、卸载和替换 Jar 包。</p></blockquote></li></ul><p>实现方法:</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">URL jarUrl </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> URL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;jar:file:&quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> File</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(jarFilePath).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getAbsolutePath</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;!/&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">DynamicJarClassLoader dynamicJarClassLoader </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> DynamicJarClassLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">new</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> URL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[]{jarUrl}, Thread.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">currentThread</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getContextClassLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">());</span></span></code></pre></div><p>动态加载 Jar 包具有以下几个显著的优势:</p><ul><li>1、灵活性: 动态加载允许应用程序在运行时根据需求加载、卸载和替换 Jar 包或其内部的类和资源,提供了极大的灵活性。</li><li>2、可维护性: 通过动态加载,可以将应用程序的核心逻辑和配置分离,使得代码更加清晰、模块化,提高了代码的可维护性。</li><li>3、热更新: 动态加载使得应用程序能够在不停机的情况下进行热更新,大大提高了系统的可用性和稳定性。</li><li>4、扩展性: 通过动态加载,可以轻松地添加新的功能模块或服务,实现应用程序的快速扩展和升级。</li></ul></div></div></main><footer class="VPDocFooter" data-v-4d316cbc data-v-35768638><!--[--><!--]--><div class="edit-info" data-v-35768638><div class="edit-link" data-v-35768638><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/cool-team-official/cool-admin-java-docs/blob/main/src/guide/plugin.md" target="_blank" rel="noreferrer" data-v-35768638><!--[--><span class="vpi-square-pen edit-link-icon" data-v-35768638></span> 在GitHub上编辑<!--]--></a></div><div class="last-updated" data-v-35768638><p class="VPLastUpdated" data-v-35768638 data-v-32a58613>最后更新于: <time datetime="2024-07-18T02:55:30.000Z" data-v-32a58613></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-35768638><span class="visually-hidden" id="doc-footer-aria-label" data-v-35768638>Pager</span><div class="pager" data-v-35768638><a class="VPLink link pager-link prev" href="/src/guide/flow.html" data-v-35768638><!--[--><span class="desc" data-v-35768638>上一页</span><span class="title" data-v-35768638>Ai流程编排</span><!--]--></a></div><div class="pager" data-v-35768638><a class="VPLink link pager-link next" href="/src/guide/dev.html" data-v-35768638><!--[--><span class="desc" data-v-35768638>下一页</span><span class="title" data-v-35768638>开发方式</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-fbfa64bf data-v-45624e61><div class="container" data-v-45624e61><p class="message" data-v-45624e61>COOL为开发者而生</p><p class="copyright" data-v-45624e61><a href="https://beian.miit.gov.cn">Copyright © COOL | 闽ICP备2024042701号</a></p></div></footer><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"index.md\":\"Dsd7aigo\",\"readme.md\":\"Rd2D_BZq\",\"src_about_index.md\":\"-unb0L2u\",\"src_guide_ai.md\":\"aIl2n3N7\",\"src_guide_cache.md\":\"DYexoE7d\",\"src_guide_controller.md\":\"ChJ_NED0\",\"src_guide_db.md\":\"CH-r16iF\",\"src_guide_deploy.md\":\"CVc1dXEU\",\"src_guide_dev.md\":\"DM1UjwvK\",\"src_guide_dir.md\":\"Bywk12Mo\",\"src_guide_exception.md\":\"1HCd76m1\",\"src_guide_flow.md\":\"DMDsOCkF\",\"src_guide_i18n.md\":\"D4ikqxxm\",\"src_guide_initdata.md\":\"BhdPvNop\",\"src_guide_lock.md\":\"C8JTDlsP\",\"src_guide_norepeatsubmit.md\":\"CvFjLc1r\",\"src_guide_plugin.md\":\"DSQp6REO\",\"src_guide_quick.md\":\"g_DIbvkh\",\"src_guide_recordlog.md\":\"B0w4IZH7\",\"src_guide_security.md\":\"BFmZQZP9\",\"src_guide_service.md\":\"CokY9neI\",\"src_guide_swagger.md\":\"CCfA6TBH\",\"src_guide_tenant.md\":\"CP_z92JB\",\"src_guide_uniqueidgen.md\":\"BNiKKfQz\",\"src_guide_upload.md\":\"D-dQqFKU\",\"src_introduce_index.md\":\"BaUz4Xtw\",\"src_introduce_show.md\":\"Ck0DuCIX\",\"src_introduce_src.md\":\"UlNmfnNt\",\"src_question_common.md\":\"Caojqqth\",\"src_todo_plan.md\":\"pGnBM6_r\",\"src_todo_update.md\":\"DUbMUQW8\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Cool Admin\",\"description\":\"一个很酷的后台管理系统开发框架\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.png\",\"search\":{\"provider\":\"local\"},\"footer\":{\"message\":\"COOL为开发者而生\",\"copyright\":\"<a href=\\\"https://beian.miit.gov.cn\\\">Copyright © COOL | 闽ICP备2024042701号</a>\"},\"docFooter\":{\"prev\":\"上一页\",\"next\":\"下一页\"},\"outline\":{\"label\":\"页面导航\",\"level\":[2,3]},\"lastUpdated\":{\"text\":\"最后更新于\",\"formatOptions\":{\"dateStyle\":\"short\",\"timeStyle\":\"medium\"}},\"langMenuLabel\":\"多语言\",\"returnToTopLabel\":\"回到顶部\",\"sidebarMenuLabel\":\"菜单\",\"darkModeSwitchLabel\":\"主题\",\"lightModeSwitchTitle\":\"切换到浅色模式\",\"darkModeSwitchTitle\":\"切换到深色模式\",\"editLink\":{\"text\":\"在GitHub上编辑\",\"pattern\":\"https://github.com/cool-team-official/cool-admin-java-docs/blob/main/:path\"},\"nav\":[{\"text\":\"介绍\",\"link\":\"/src/introduce/index.md\",\"noIcon\":false},{\"text\":\"教程\",\"link\":\"/src/guide/quick.md\"},{\"text\":\"🔥插件市场\",\"link\":\"https://cool-js.com/plugin\"},{\"text\":\"交流合作\",\"link\":\"/src/about/index.md\"},{\"text\":\"v7.1.0\",\"items\":[{\"text\":\"更新日志\",\"link\":\"/src/todo/update.md\"},{\"text\":\"版本计划\",\"link\":\"/src/todo/plan.md\"}]},{\"text\":\"更多\",\"items\":[{\"text\":\"Cool 官网\",\"link\":\"https://cool-js.com\"},{\"text\":\"Cool Admin(Nodejs版)\",\"link\":\"https://node.cool-admin.com\"},{\"text\":\"Cool Admin Vue(前端)\",\"link\":\"https://node.cool-js.com\"},{\"text\":\"Uni(基于uni-app跨端移动端开发)\",\"link\":\"https://uni-docs.cool-js.com\"}]}],\"sidebar\":[{\"text\":\"介绍\",\"items\":[{\"text\":\"简介\",\"link\":\"/src/introduce/index.md\"},{\"text\":\"演示\",\"link\":\"/src/introduce/show.md\"},{\"text\":\"源码\",\"link\":\"/src/introduce/src.md\"}]},{\"text\":\"教程\",\"items\":[{\"text\":\"快速开始\",\"link\":\"/src/guide/quick.md\"},{\"text\":\"目录结构\",\"link\":\"/src/guide/dir.md\"},{\"text\":\"Ai编码\",\"link\":\"/src/guide/ai.md\"},{\"text\":\"Ai流程编排\",\"link\":\"/src/guide/flow.md\"},{\"text\":\"扩展插件\",\"link\":\"/src/guide/plugin.md\"},{\"text\":\"开发方式\",\"link\":\"/src/guide/dev.md\"},{\"text\":\"核心\",\"items\":[{\"text\":\"控制器(controller)\",\"link\":\"/src/guide/controller.md\"},{\"text\":\"服务(service)\",\"link\":\"/src/guide/service.md\"},{\"text\":\"数据库(db)\",\"link\":\"/src/guide/db.md\"},{\"text\":\"缓存(cache)\",\"link\":\"/src/guide/cache.md\"},{\"text\":\"文件上传(file)\",\"link\":\"/src/guide/upload.md\"},{\"text\":\"统一异常(exception)\",\"link\":\"/src/guide/exception.md\"},{\"text\":\"权限校验(security)\",\"link\":\"/src/guide/security.md\"},{\"text\":\"数据初始化(init)\",\"link\":\"/src/guide/initData.md\"},{\"text\":\"分布式ID(id)\",\"link\":\"/src/guide/uniqueIDGen.md\"},{\"text\":\"锁(lock)\",\"link\":\"/src/guide/lock.md\"},{\"text\":\"防重提交(submit)\",\"link\":\"/src/guide/noRepeatSubmit.md\"},{\"text\":\"请求日志(log)\",\"link\":\"/src/guide/recordLog.md\"},{\"text\":\"接口文档(swagger)\",\"link\":\"/src/guide/swagger.md\"},{\"text\":\"多租户(tenant)\",\"link\":\"/src/guide/tenant.md\"},{\"text\":\"国际化多语言(i18n)\",\"link\":\"/src/guide/i18n.md\"}]},{\"text\":\"部署项目\",\"link\":\"/src/guide/deploy.md\"}]},{\"text\":\"计划&更新\",\"items\":[{\"text\":\"更新\",\"link\":\"/src/todo/update.md\"},{\"text\":\"计划\",\"link\":\"/src/todo/plan.md\"}]},{\"text\":\"常见问题\",\"link\":\"/src/question/common.md\"},{\"text\":\"交流合作\",\"link\":\"/src/about/index.md\"}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/cool-team-official/cool-admin-java\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
</body>
</html>