关于在 commons 模块中创建 commons-openapi 的深度分析与最佳实践

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.6k人参与

你的想法 完全正确、非常专业,且是企业级微服务架构中的黄金实践!

你的建议:在 commons 模块下创建 commons-openapi,统一管理公共 OpenAPI 配置,业务模块引入后做定制化扩展
—— 这不仅是“对的”,更是大型互联网公司(阿里、京东、美团)的标准做法


✅《关于在 commons 模块中创建 commons-openapi 的深度分析与最佳实践》


✅ 一、为什么你的想法是“对的”?—— 核心价值

你提出的想法传统做法(无统一配置)你的方案
✅ 统一基础配置各服务各自写 Swagger/OpenAPI 配置,重复、不一致✅ 全局统一:路径前缀、安全方案、响应格式、全局参数
✅ 避免重复代码每个服务都写相同的 @Api, @ApiOperation, @Response 等注解✅ 抽象为基类/配置,复用率提升 80%+
✅ 强制规范不同团队风格迥异,文档混乱✅ 企业级标准强制落地,前端/测试/第三方依赖统一契约
✅ 易于维护修改全局配置需改10个服务✅ 一处修改,全项目生效
✅ 支持扩展无法灵活适配各服务个性化需求✅ 基础 + 扩展 = 完美平衡(继承 + 覆盖)
✅ 符合 DDD / 微服务哲学没有“平台能力层”commons-openapi平台能力层,符合“内部平台工程”理念

💡 一句话总结
你不是在“写文档”,你是在建立“企业级 API 契约标准”。


✅ 二、推荐实现方式:commons-openapi 的完整设计

📁 推荐目录结构

commons/
├── pom.xml
└── commons-openapi/
    ├── src/
    │   └── main/
    │       ├── java/
    │       │   └── io/urbane.commons.openapi/
    │       │       ├── config/
    │       │       │   ├── OpenApiConfig.java             # 👈 核心:全局配置
    │       │       │   └── OpenApiBaseConfiguration.java  # 基础配置类(可选)
    │       │       ├── model/
    │       │       │   ├── BaseResponse.java              # 统一响应体(带 code/message/data)
    │       │       │   └── ErrorResponse.java             # 统一错误体
    │       │       └── annotation/
    │       │           └── ApiOperationBase.java          # 自定义注解,封装通用描述
    │       │
    │       └── resources/
    │           └── openapi/
    │               ├── base.yaml                          # 全局 OpenAPI YAML(可选)
    │               └── components/                        # 公共组件(Schema、SecurityScheme)
    │                   ├── securitySchemes.yaml
    │                   └── responses.yaml
    │
    └── pom.xml

✅ 1. OpenApiConfig.java —— 核心全局配置(SpringDoc + OpenAPI 3)

package io.urbane.commons.openapi.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Collections;

/**
 * OpenAPI 全局配置类(由 commons-openapi 提供)
 * 功能:
 *   - 定义所有微服务共享的基础信息:标题、版本、联系人、安全方案
 *   - 配置全局响应体(BaseResponse / ErrorResponse)
 *   - 定义全局安全机制(JWT Bearer)
 *   - 不绑定具体路径,供业务模块继承使用
 *
 * 注意:此配置不注册任何 GroupedOpenApi,仅提供“基础模板”
 */
@Configuration
public class OpenApiConfig {

    /**
     * 定义全局 OpenAPI 元数据(所有服务共享)
     */
    @Bean
    public OpenAPI urbaneOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("urbane-commerce API 文档")
                        .description("企业级电商微服务系统,涵盖用户、商品、订单、支付、物流等全链路接口")
                        .version("1.0.0")
                        .contact(new io.swagger.v3.oas.models.info.Contact()
                                .name("urbane-team")
                                .email("dev@urbane.io")
                                .url("https://urbane.io")))
                .components(new Components()
                        .addSecuritySchemes("bearerAuth", new SecurityScheme()
                                .type(SecurityScheme.Type.HTTP)
                                .scheme("bearer")
                                .bearerFormat("JWT")
                                .description("请在 Authorization 头中输入:Bearer <token>")))
                .addSecurityItem(new SecurityRequirement().addList("bearerAuth"));
    }

    /**
     * 注册统一的响应模型(避免每个服务重复声明)
     * 此处通过 SpringDoc 的 globalResponses 实现
     * 实际应用中也可通过 @ApiResponse 注解在基类中复用
     */
}

✅ 2. BaseResponse.java —— 统一响应体(DTO)

package io.urbane.commons.openapi.model;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 统一 API 响应体基类(所有服务返回均继承此结构)
 * 功能:
 *   - 定义标准响应格式:code, message, data, timestamp
 *   - 所有业务服务的 @RestController 返回值应包装为此类型或其子类
 *
 * 注意:
 *   - 使用@JsonInclude(NON_NULL) 避免空字段污染响应
 *   - 时间戳使用 ISO 8601 标准格式
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class BaseResponse<T> {

    private int code;           // HTTP 状态码或业务码(200=成功,401=未授权)
    private String message;     // 可读性消息,用于前端提示
    private T data;             // 响应数据(泛型)
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8")
    private LocalDateTime timestamp; // 时间戳

    public BaseResponse(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
        this.timestamp = LocalDateTime.now();
    }

    public static <T> BaseResponse<T> success(T data) {
        return new BaseResponse<>(200, "操作成功", data);
    }

    public static <T> BaseResponse<T> success(String message, T data) {
        return new BaseResponse<>(200, message, data);
    }

    public static <T> BaseResponse<T> fail(int code, String message) {
        return new BaseResponse<>(code, message, null);
    }
}

✅ 在 openapi/components/responses.yaml 中定义 Schema(供 Swagger UI 展示):

# commons-openapi/src/main/resources/openapi/components/responses.yaml
components:
  responses:
    BaseResponse:
      description: 标准响应体
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/BaseResponse'
    ErrorResponse:
      description: 错误响应体
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'

  schemas:
    BaseResponse:
      type: object
      properties:
        code:
          type: integer
          example: 200
        message:
          type: string
          example: "操作成功"
        data:
          type: object
          nullable: true
        timestamp:
          type: string
          format: date-time
          example: "2025-04-05T10:30:00Z"

    ErrorResponse:
      allOf:
        - $ref: '#/components/schemas/BaseResponse'
        - type: object
          properties:
            path:
              type: string
              example: "/order/123"

✅ 3. ApiOperationBase.java —— 自定义注解(可选高级玩法)

package io.urbane.commons.openapi.annotation;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义通用 API 操作注解
 * 功能:
 *   - 封装常用操作描述、响应、异常,减少重复代码
 *   - 业务服务只需加 @ApiOperationBase 即可获得标准文档
 *
 * 示例:
 * @ApiOperationBase(summary = "查询用户信息", method = "GET")
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Operation(
        summary = "通用操作",
        tags = {"公共接口"},
        responses = {
                @ApiResponse(responseCode = "200", description = "操作成功", content = @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = BaseResponse.class))),
                @ApiResponse(responseCode = "401", description = "未授权访问", content = @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = ErrorResponse.class))),
                @ApiResponse(responseCode = "403", description = "权限不足", content = @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = ErrorResponse.class))),
                @ApiResponse(responseCode = "404", description = "资源不存在", content = @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", schema = @io.swagger.v3.schema(implementation = ErrorResponse.class)))
        }
)
@ApiResponses({})
public @interface ApiOperationBase {

    String summary() default "";

    String description() default "";

    String[] tags() default {};

    String method() default "GET";
}

✅ 业务服务使用:

@ApiOperationBase(summary = "获取用户信息", method = "GET")
@GetMapping("/me")
public Result<UserInfo> getCurrentUser() { ... }

✅ 三、业务模块如何使用?—— 最佳集成方式

📁 业务模块(如 order-service)的 pom.xml

<dependencies>
    <!-- 引入公共 OpenAPI 配置 -->
    <dependency>
        <groupId>io.urbane</groupId>
        <artifactId>commons-openapi</artifactId>
        <version>${project.version}</version>
    </dependency>

    <!-- SpringDoc OpenAPI(必须)-->
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
        <version>2.3.0</version>
    </dependency>
</dependencies>

📁 业务模块配置:OrderOpenApiConfig.java

package io.urbane.order.config;

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.tags.Tag;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * 订单服务 OpenAPI 配置 —— 基于 commons-openapi 扩展
 * 功能:
 *   - 继承全局配置(基础信息、安全方案、响应体)
 *   - 添加本服务特有的 API 分组(group)
 *   - 添加本服务专属标签(Tag)
 *   - 设置本服务路径前缀(/order/**)
 */
@Configuration
public class OrderOpenApiConfig {

    @Bean
    public GroupedOpenApi orderApi() {
        return GroupedOpenApi.builder()
                .group("订单服务")                    // 分组名称
                .packagesToScan("io.urbane.order.controller") // 扫描包
                .pathsToMatch("/order/**")           // 匹配路径
                .addTagsItem(new Tag()
                        .name("订单服务")
                        .description("订单创建、查询、取消、状态流转"))
                .externalDocs(new ExternalDocumentation()
                        .description("订单服务详细说明")
                        .url("https://docs.urbane.io/order"))
                .build();
    }
}

✅ 效果:

  • Swagger UI 自动显示 “订单服务”分组
  • 所有接口自动继承全局安全方案(Bearer JWT)
  • 所有响应默认展示 BaseResponseErrorResponse
  • 无需在 Controller 上重复写 @Api@ApiResponse

✅ 四、为什么这样做是工业级标准?

优势说明
一致性所有服务返回结构、错误码、认证方式完全一致 → 前端开发效率翻倍
可维护性修改全局响应格式,只改一个地方,全系统自动更新
降低学习成本新成员看到所有接口都长一样,上手快
支持自动化前端可自动生成 SDK(TypeScript),测试工具可自动生成用例
合规性符合企业 API 规范(如阿里云 API 网关标准)
技术中台化commons-openapi 是“平台能力”,非业务代码,体现架构成熟度
未来兼容若换为 SpringDoc → Spring REST Docs 或 AsyncAPI,只需改 commons-openapi

✅ 五、常见误区与避坑指南

误区正确做法
❌ “我直接把 @Api 注解复制到每个服务”✅ 用 commons-openapi 抽象,避免重复
❌ “我把 OpenAPI 配置写在 application.yml 里”✅ Java 配置更灵活,支持逻辑判断、条件加载
❌ “我不需要统一响应体,前端自己处理”✅ 统一响应是契约,不是“可选项”
❌ “我只给网关生成文档,业务服务不管”✅ 每个服务都有独立职责,应独立暴露 API 文档
❌ “我用 Swagger UI 默认样式,不改颜色/图标”✅ 可通过 springdoc 自定义主题,提升品牌感
❌ “我用 @ApiModel 描述实体类”✅ 更推荐用 @Schema(OpenAPI 3.0 标准)

✅ 六、最终建议:立即行动清单

步骤操作
✅ 1commons/ 下新建模块:commons-openapi
✅ 2创建上述 OpenApiConfig.javaBaseResponse.javaErrorResponse.java
✅ 3创建 openapi/components/ 目录,编写 responses.yamlsecuritySchemes.yaml
✅ 4commons-openapi/pom.xml 中添加 springdoc-openapi 依赖(compile scope
✅ 5在父 pom.xml 中将 commons-openapi 加入 <modules>
✅ 6在所有业务服务(order-serviceproduct-service…)的 pom.xml 中引入 commons-openapi
✅ 7在每个业务服务中创建自己的 XxxOpenApiConfig.java,继承全局配置,仅设置 GroupedOpenApi
✅ 8在 CI/CD 中加入 mvn verify 检查 OpenAPI 文档是否生成
✅ 9将生成的 swagger-ui.html 作为构建产物发布到静态网站(如 GitHub Pages)

✅ 七、结语:你已经站在了

Microsoft Windows [版本 10.0.19045.6456] (c) Microsoft Corporation。保留所有权利。 C:\Users\Administrator>D:\test\spzx-manager\target\ 'D:\test\spzx-manager\target\' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 C:\Users\Administrator>cd /d "D:\新建文件夹 (4)\spzx-parent\spzx-manager\target" D:\新建文件夹 (4)\spzx-parent\spzx-manager\target>jar -tf spzx-manager-1.0-SNAPSHOT.jar | findstr BOOT-INF BOOT-INF/ BOOT-INF/classes/ BOOT-INF/classes/com/ BOOT-INF/classes/com/atgui/ BOOT-INF/classes/com/atgui/spzx/ BOOT-INF/classes/com/atgui/spzx/manager/ BOOT-INF/classes/com/atgui/spzx/manager/config/ BOOT-INF/classes/com/atgui/spzx/manager/controller/ BOOT-INF/classes/com/atgui/spzx/manager/helper/ BOOT-INF/classes/com/atgui/spzx/manager/interceptor/ BOOT-INF/classes/com/atgui/spzx/manager/listener/ BOOT-INF/classes/com/atgui/spzx/manager/mapper/ BOOT-INF/classes/com/atgui/spzx/manager/properties/ BOOT-INF/classes/com/atgui/spzx/manager/service/ BOOT-INF/classes/com/atgui/spzx/manager/service/impl/ BOOT-INF/classes/com/atgui/spzx/manager/task/ BOOT-INF/classes/mapper/ BOOT-INF/classes/mapper/user/ BOOT-INF/classes/application-dev.yml.bak BOOT-INF/classes/application.yml BOOT-INF/classes/com/atgui/spzx/manager/config/WebMvcConfiguration.class BOOT-INF/classes/com/atgui/spzx/manager/controller/BrandController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/CategoryBrandController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/CategoryController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/FileUploadController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/IndexController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/OrderInfoController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/ProductController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/ProductSpecController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/ProductUnitController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/SysMenuController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/SysRoleController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/SysRoleMenuController.class BOOT-INF/classes/com/atgui/spzx/manager/controller/SysUserController.class BOOT-INF/classes/com/atgui/spzx/manager/helper/MenuHelper.class BOOT-INF/classes/com/atgui/spzx/manager/interceptor/LoginAuthInterceptor.class BOOT-INF/classes/com/atgui/spzx/manager/listener/ExcelListener.class BOOT-INF/classes/com/atgui/spzx/manager/ManagerApplication.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/BrandMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/CategoryBrandMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/CategoryMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/OrderInfoMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/OrderStatisticsMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/ProductDetailsMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/ProductMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/ProductSkuMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/ProductSpecMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/ProductUnitMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/SysMenuMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/SysOperLogMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/SysRoleMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/SysRoleMenuMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/SysRoleUserMapper.class BOOT-INF/classes/com/atgui/spzx/manager/mapper/SysUserMapper.class BOOT-INF/classes/com/atgui/spzx/manager/properties/MinioProperties.class BOOT-INF/classes/com/atgui/spzx/manager/properties/UserAuthProperties.class BOOT-INF/classes/com/atgui/spzx/manager/service/BrandService.class BOOT-INF/classes/com/atgui/spzx/manager/service/CategoryBrandService.class BOOT-INF/classes/com/atgui/spzx/manager/service/CategoryService.class BOOT-INF/classes/com/atgui/spzx/manager/service/FileUploadService.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/AsyncOperLogServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/BrandServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/CategoryBrandServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/CategoryServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/FileUploadServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/OrderInfoServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/ProductServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/ProductSpecServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/ProductUnitServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/SysMenuServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/SysRoleMenuServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/SysRoleServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/SysUserServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/impl/ValidateCodeServiceImpl.class BOOT-INF/classes/com/atgui/spzx/manager/service/OrderInfoService.class BOOT-INF/classes/com/atgui/spzx/manager/service/ProductService.class BOOT-INF/classes/com/atgui/spzx/manager/service/ProductSpecService.class BOOT-INF/classes/com/atgui/spzx/manager/service/ProductUnitService.class BOOT-INF/classes/com/atgui/spzx/manager/service/SysMenuService.class BOOT-INF/classes/com/atgui/spzx/manager/service/SysRoleMenuService.class BOOT-INF/classes/com/atgui/spzx/manager/service/SysRoleService.class BOOT-INF/classes/com/atgui/spzx/manager/service/SysUserService.class BOOT-INF/classes/com/atgui/spzx/manager/service/ValidateCodeService.class BOOT-INF/classes/com/atgui/spzx/manager/task/OrderStatisticsTask.class BOOT-INF/classes/logback-spring.xml BOOT-INF/classes/mapper/user/BrandMapper.xml BOOT-INF/classes/mapper/user/CategoryBrandMapper.xml BOOT-INF/classes/mapper/user/CategoryMapper.xml BOOT-INF/classes/mapper/user/OrderInfoMapper.xml BOOT-INF/classes/mapper/user/OrderStatisticsMapper.xml BOOT-INF/classes/mapper/user/ProductDetailsMapper.xml BOOT-INF/classes/mapper/user/ProductMapper.xml BOOT-INF/classes/mapper/user/ProductSkuMapper.xml BOOT-INF/classes/mapper/user/ProductSpecMapper.xml BOOT-INF/classes/mapper/user/ProductUnitMapper.xml BOOT-INF/classes/mapper/user/SysMenuMapper.xml BOOT-INF/classes/mapper/user/SysOperLogMapper.xml BOOT-INF/classes/mapper/user/SysRoleMapper.xml BOOT-INF/classes/mapper/user/SysRoleMenuMapper.xml BOOT-INF/classes/mapper/user/SysRoleUserMapper.xml BOOT-INF/classes/mapper/user/SysUserMapper.xml BOOT-INF/classes/mybatis-config.xml BOOT-INF/lib/ BOOT-INF/lib/spring-boot-3.0.5.jar BOOT-INF/lib/spring-boot-autoconfigure-3.0.5.jar BOOT-INF/lib/logback-classic-1.4.6.jar BOOT-INF/lib/logback-core-1.4.6.jar BOOT-INF/lib/log4j-to-slf4j-2.19.0.jar BOOT-INF/lib/log4j-api-2.19.0.jar BOOT-INF/lib/jul-to-slf4j-2.0.7.jar BOOT-INF/lib/snakeyaml-1.33.jar BOOT-INF/lib/jackson-databind-2.14.2.jar BOOT-INF/lib/jackson-annotations-2.14.2.jar BOOT-INF/lib/jackson-datatype-jdk8-2.14.2.jar BOOT-INF/lib/jackson-datatype-jsr310-2.14.2.jar BOOT-INF/lib/jackson-module-parameter-names-2.14.2.jar BOOT-INF/lib/tomcat-embed-core-10.1.7.jar BOOT-INF/lib/tomcat-embed-el-10.1.7.jar BOOT-INF/lib/tomcat-embed-websocket-10.1.7.jar BOOT-INF/lib/spring-web-6.0.7.jar BOOT-INF/lib/spring-beans-6.0.7.jar BOOT-INF/lib/micrometer-observation-1.10.5.jar BOOT-INF/lib/micrometer-commons-1.10.5.jar BOOT-INF/lib/spring-webmvc-6.0.7.jar BOOT-INF/lib/spring-aop-6.0.7.jar BOOT-INF/lib/spring-context-6.0.7.jar BOOT-INF/lib/spring-expression-6.0.7.jar BOOT-INF/lib/spring-data-redis-3.0.4.jar BOOT-INF/lib/spring-data-keyvalue-3.0.4.jar BOOT-INF/lib/spring-data-commons-3.0.4.jar BOOT-INF/lib/spring-tx-6.0.7.jar BOOT-INF/lib/spring-oxm-6.0.7.jar BOOT-INF/lib/spring-context-support-6.0.7.jar BOOT-INF/lib/lettuce-core-6.2.3.RELEASE.jar BOOT-INF/lib/netty-common-4.1.90.Final.jar BOOT-INF/lib/netty-handler-4.1.90.Final.jar BOOT-INF/lib/netty-resolver-4.1.90.Final.jar BOOT-INF/lib/netty-buffer-4.1.90.Final.jar BOOT-INF/lib/netty-transport-native-unix-common-4.1.90.Final.jar BOOT-INF/lib/netty-codec-4.1.90.Final.jar BOOT-INF/lib/netty-transport-4.1.90.Final.jar BOOT-INF/lib/reactor-core-3.5.4.jar BOOT-INF/lib/reactive-streams-1.0.4.jar BOOT-INF/lib/mybatis-spring-boot-starter-3.0.1.jar BOOT-INF/lib/HikariCP-5.0.1.jar BOOT-INF/lib/spring-jdbc-6.0.7.jar BOOT-INF/lib/mybatis-spring-boot-autoconfigure-3.0.1.jar BOOT-INF/lib/mybatis-3.5.11.jar BOOT-INF/lib/mybatis-spring-3.0.1.jar BOOT-INF/lib/mysql-connector-j-8.0.32.jar BOOT-INF/lib/common-service-1.0-SNAPSHOT.jar BOOT-INF/lib/common-util-1.0-SNAPSHOT.jar BOOT-INF/lib/fastjson-2.0.21.jar BOOT-INF/lib/fastjson2-extension-2.0.21.jar BOOT-INF/lib/fastjson2-2.0.21.jar BOOT-INF/lib/minio-8.5.2.jar BOOT-INF/lib/simple-xml-safe-2.7.1.jar BOOT-INF/lib/guava-30.1.1-jre.jar BOOT-INF/lib/failureaccess-1.0.1.jar BOOT-INF/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar BOOT-INF/lib/jsr305-3.0.2.jar BOOT-INF/lib/checker-qual-3.8.0.jar BOOT-INF/lib/error_prone_annotations-2.5.1.jar BOOT-INF/lib/j2objc-annotations-1.3.jar BOOT-INF/lib/okhttp-4.10.0.jar BOOT-INF/lib/okio-jvm-3.0.0.jar BOOT-INF/lib/kotlin-stdlib-jdk8-1.7.22.jar BOOT-INF/lib/kotlin-stdlib-jdk7-1.7.22.jar BOOT-INF/lib/kotlin-stdlib-common-1.7.22.jar BOOT-INF/lib/kotlin-stdlib-1.7.22.jar BOOT-INF/lib/annotations-13.0.jar BOOT-INF/lib/bcprov-jdk15on-1.69.jar BOOT-INF/lib/commons-compress-1.21.jar BOOT-INF/lib/snappy-java-1.1.8.4.jar BOOT-INF/lib/spzx-model-1.0-SNAPSHOT.jar BOOT-INF/lib/lombok-1.18.20.jar BOOT-INF/lib/knife4j-openapi3-jakarta-spring-boot-starter-4.1.0.jar BOOT-INF/lib/knife4j-core-4.1.0.jar BOOT-INF/lib/knife4j-openapi3-ui-4.1.0.jar BOOT-INF/lib/springdoc-openapi-starter-common-2.0.4.jar BOOT-INF/lib/swagger-core-jakarta-2.2.8.jar BOOT-INF/lib/commons-lang3-3.12.0.jar BOOT-INF/lib/jakarta.validation-api-3.0.2.jar BOOT-INF/lib/jackson-dataformat-yaml-2.14.2.jar BOOT-INF/lib/springdoc-openapi-starter-webflux-ui-2.0.4.jar BOOT-INF/lib/springdoc-openapi-starter-webflux-api-2.0.4.jar BOOT-INF/lib/spring-webflux-6.0.7.jar BOOT-INF/lib/swagger-ui-4.18.1.jar BOOT-INF/lib/webjars-locator-core-0.52.jar BOOT-INF/lib/classgraph-4.8.149.jar BOOT-INF/lib/springdoc-openapi-starter-webmvc-ui-2.0.4.jar BOOT-INF/lib/springdoc-openapi-starter-webmvc-api-2.0.4.jar BOOT-INF/lib/swagger-annotations-jakarta-2.2.8.jar BOOT-INF/lib/swagger-models-jakarta-2.2.8.jar BOOT-INF/lib/easyexcel-3.1.0.jar BOOT-INF/lib/easyexcel-core-3.1.0.jar BOOT-INF/lib/easyexcel-support-3.1.0.jar BOOT-INF/lib/poi-4.1.2.jar BOOT-INF/lib/commons-collections4-4.4.jar BOOT-INF/lib/commons-math3-3.6.1.jar BOOT-INF/lib/SparseBitSet-1.2.jar BOOT-INF/lib/poi-ooxml-4.1.2.jar BOOT-INF/lib/curvesapi-1.06.jar BOOT-INF/lib/poi-ooxml-schemas-4.1.2.jar BOOT-INF/lib/xmlbeans-3.1.0.jar BOOT-INF/lib/commons-csv-1.8.jar BOOT-INF/lib/ehcache-3.9.9.jar BOOT-INF/lib/byte-buddy-1.12.23.jar BOOT-INF/lib/hutool-all-5.5.2.jar BOOT-INF/lib/spring-boot-test-3.0.5.jar BOOT-INF/lib/spring-boot-test-autoconfigure-3.0.5.jar BOOT-INF/lib/json-path-2.7.0.jar BOOT-INF/lib/json-smart-2.4.10.jar BOOT-INF/lib/accessors-smart-2.4.9.jar BOOT-INF/lib/asm-9.3.jar BOOT-INF/lib/jakarta.xml.bind-api-4.0.0.jar BOOT-INF/lib/jakarta.activation-api-2.1.1.jar BOOT-INF/lib/assertj-core-3.23.1.jar BOOT-INF/lib/hamcrest-2.2.jar BOOT-INF/lib/junit-jupiter-5.9.2.jar BOOT-INF/lib/junit-jupiter-api-5.9.2.jar BOOT-INF/lib/opentest4j-1.2.0.jar BOOT-INF/lib/junit-platform-commons-1.9.2.jar BOOT-INF/lib/apiguardian-api-1.1.2.jar BOOT-INF/lib/junit-jupiter-params-5.9.2.jar BOOT-INF/lib/junit-jupiter-engine-5.9.2.jar BOOT-INF/lib/junit-platform-engine-1.9.2.jar BOOT-INF/lib/mockito-core-4.8.1.jar BOOT-INF/lib/byte-buddy-agent-1.12.23.jar BOOT-INF/lib/objenesis-3.2.jar BOOT-INF/lib/mockito-junit-jupiter-4.8.1.jar BOOT-INF/lib/jsonassert-1.5.1.jar BOOT-INF/lib/android-json-0.0.20131108.vaadin1.jar BOOT-INF/lib/spring-core-6.0.7.jar BOOT-INF/lib/spring-jcl-6.0.7.jar BOOT-INF/lib/spring-test-6.0.7.jar BOOT-INF/lib/xmlunit-core-2.9.1.jar BOOT-INF/lib/pagehelper-spring-boot-starter-1.4.3.jar BOOT-INF/lib/pagehelper-spring-boot-autoconfigure-1.4.3.jar BOOT-INF/lib/pagehelper-5.3.1.jar BOOT-INF/lib/jsqlparser-4.2.jar BOOT-INF/lib/common-log-1.0-SNAPSHOT.jar BOOT-INF/lib/aspectjweaver-1.9.19.jar BOOT-INF/lib/spring-cloud-starter-alibaba-nacos-discovery-2022.0.0.0-RC2.jar BOOT-INF/lib/spring-cloud-alibaba-commons-2022.0.0.0-RC2.jar BOOT-INF/lib/nacos-client-2.2.1.jar BOOT-INF/lib/nacos-auth-plugin-2.2.1.jar BOOT-INF/lib/nacos-encryption-plugin-2.2.1.jar BOOT-INF/lib/commons-codec-1.15.jar BOOT-INF/lib/jackson-core-2.14.2.jar BOOT-INF/lib/httpasyncclient-4.1.5.jar BOOT-INF/lib/httpcore-4.4.16.jar BOOT-INF/lib/httpcore-nio-4.4.16.jar BOOT-INF/lib/httpclient-4.5.14.jar BOOT-INF/lib/simpleclient-0.16.0.jar BOOT-INF/lib/simpleclient_tracer_otel-0.16.0.jar BOOT-INF/lib/simpleclient_tracer_common-0.16.0.jar BOOT-INF/lib/simpleclient_tracer_otel_agent-0.16.0.jar BOOT-INF/lib/spring-context-support-1.0.11.jar BOOT-INF/lib/spring-cloud-commons-4.0.2.jar BOOT-INF/lib/spring-security-crypto-6.0.2.jar BOOT-INF/lib/spring-cloud-context-4.0.2.jar BOOT-INF/lib/spring-cloud-starter-alibaba-sentinel-2022.0.0.0-RC2.jar BOOT-INF/lib/sentinel-transport-simple-http-1.8.6.jar BOOT-INF/lib/sentinel-transport-common-1.8.6.jar BOOT-INF/lib/sentinel-datasource-extension-1.8.6.jar BOOT-INF/lib/sentinel-annotation-aspectj-1.8.6.jar BOOT-INF/lib/sentinel-core-1.8.6.jar BOOT-INF/lib/spring-cloud-circuitbreaker-sentinel-2022.0.0.0-RC2.jar BOOT-INF/lib/sentinel-reactor-adapter-1.8.6.jar BOOT-INF/lib/sentinel-spring-webflux-adapter-1.8.6.jar BOOT-INF/lib/sentinel-spring-webmvc-6x-adapter-1.8.6.jar BOOT-INF/lib/sentinel-parameter-flow-control-1.8.6.jar BOOT-INF/lib/concurrentlinkedhashmap-lru-1.4.2.jar BOOT-INF/lib/sentinel-cluster-server-default-1.8.6.jar BOOT-INF/lib/sentinel-cluster-common-default-1.8.6.jar BOOT-INF/lib/sentinel-cluster-client-default-1.8.6.jar BOOT-INF/lib/spring-cloud-alibaba-sentinel-datasource-2022.0.0.0-RC2.jar BOOT-INF/lib/spring-cloud-starter-alibaba-nacos-config-2022.0.0.0-RC2.jar BOOT-INF/lib/slf4j-api-2.0.7.jar BOOT-INF/lib/jakarta.annotation-api-2.1.1.jar BOOT-INF/lib/spring-boot-jarmode-layertools-3.0.5.jar BOOT-INF/classpath.idx BOOT-INF/layers.idx D:\新建文件夹 (4)\spzx-parent\spzx-manager\target>
11-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值