You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus生产构建中如何排除openapi扩展?

在Quarkus生产构建中排除SmallRye OpenAPI扩展并剥离相关注解

完全可以在生产构建中排除该扩展,同时后续使用注解时也能确保生产包只保留核心代码,以下是具体实现方案:

一、生产构建直接排除SmallRye OpenAPI扩展

根据你使用的构建工具,有两种常用方式:

Maven 配置方式

  1. 通过Profile分环境管理依赖
    在pom.xml中配置开发/测试环境自动加载扩展,生产环境不包含:
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <dependencies>
            <dependency>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-smallrye-openapi</artifactId>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>prod</id>
        <!-- 生产环境不引入该扩展 -->
    </profile>
</profiles>

构建生产包时执行:

mvn clean package -Pprod
  1. 构建命令临时排除
    无需修改pom,直接在生产构建命令中添加排除参数:
mvn clean package -Dquarkus.extensions.exclude=io.quarkus:quarkus-smallrye-openapi

Gradle 配置方式

  1. 通过Profile控制依赖
    在build.gradle中根据Quarkus profile决定是否引入扩展:
plugins {
    id 'io.quarkus'
}

quarkus {
    profile = System.getProperty('quarkus.profile', 'dev')
}

dependencies {
    if (quarkus.profile == 'dev') {
        implementation 'io.quarkus:quarkus-smallrye-openapi'
    }
}

生产构建执行:

./gradlew clean build -Dquarkus.profile=prod
  1. 构建命令临时排除
./gradlew clean build -Dquarkus.extensions.exclude=io.quarkus:quarkus-smallrye-openapi

二、后续使用OpenAPI注解时,生产环境剥离相关代码

如果后续代码中用到@Operation、@APIResponse等OpenAPI注解,可通过以下方式确保生产包只保留核心逻辑:

1. 使用@Profile限定注解生效范围

将标注了OpenAPI注解的类或方法限定在非生产环境,生产构建时这些代码会被自动忽略:

@Profile("!prod")
@Path("/user")
public class UserResource {
    @Operation(summary = "获取用户信息")
    @GET
    @Path("/{id}")
    public User getUser(@PathParam("id") Long id) {
        // 核心业务逻辑
        return userService.getById(id);
    }
}

2. 依赖Quarkus生产优化自动剥离注解

Quarkus生产构建默认开启quarkus.optimization.remove-unused-code=true,如果已经排除了SmallRye OpenAPI扩展,代码中未被引用的OpenAPI注解会被编译时自动移除,不会出现在最终二进制文件中。

3. 拆分注解与核心逻辑

如果需要保留方法逻辑但移除注解,可将注解单独放在非生产环境生效的方法上,核心逻辑抽离:

public class UserResource {
    // 核心逻辑方法,无注解
    public User getUserById(Long id) {
        return userService.getById(id);
    }

    // 仅非生产环境暴露带注解的接口
    @Profile("!prod")
    @Operation(summary = "获取用户信息")
    @GET
    @Path("/{id}")
    public User getUser(@PathParam("id") Long id) {
        return getUserById(id);
    }
}

总结

  • 优先通过构建Profile或命令行排除扩展,从根源上减少依赖体积
  • 后续使用注解时,用@Profile限定生效环境,确保生产包无冗余代码
  • 依赖Quarkus原生的生产优化机制,自动清理未使用的注解和代码

内容的提问来源于stack exchange,提问作者Sakibul Alam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:13:12