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

基于Springfox-Swagger2,如何在构建阶段生成OpenAPI YAML规范?

实现Springfox Swagger2生成静态OpenAPI文件(Gradle方式)

你可以通过两种常见方式在Gradle构建流程中生成静态的Swagger/OpenAPI JSON/YAML文件,以下是具体实现步骤:

方案一:通过Spring Boot测试生成(推荐)

这种方式利用Spring Boot的测试环境启动应用,调用Swagger API端点后保存响应内容,无需担心端口冲突问题。

1. 补充Gradle依赖

在build.gradle中添加必要的测试依赖(如果已有可跳过):

dependencies {
    // 原有依赖...
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.boot:spring-boot-starter-web'
    // 如果需要生成YAML格式,添加Jackson YAML转换器
    testImplementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'
}

2. 编写测试类创建生成逻辑

在测试目录下创建SwaggerStaticGeneratorTest.java:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SwaggerStaticGeneratorTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void generateSwaggerJson() throws IOException {
        // 调用你的Swagger API Docs端点
        ResponseEntity<String> response = restTemplate.getForEntity("/v1/api-docs", String.class);
        
        // 验证请求成功
        assert response.getStatusCode() == HttpStatus.OK;
        
        // 指定输出路径,可根据需求修改
        String outputPath = "build/api-docs/swagger.json";
        File outputFile = new File(outputPath);
        outputFile.getParentFile().mkdirs(); // 创建父目录
        
        // 写入JSON文件
        try (FileWriter writer = new FileWriter(outputFile)) {
            writer.write(response.getBody());
        }
    }

    @Test
    public void generateSwaggerYaml() throws IOException {
        ResponseEntity<String> response = restTemplate.getForEntity("/v1/api-docs", String.class);
        assert response.getStatusCode() == HttpStatus.OK;
        
        // 将JSON转换为YAML格式
        ObjectMapper jsonMapper = new ObjectMapper();
        Object swaggerData = jsonMapper.readValue(response.getBody(), Object.class);
        
        ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory());
        String yamlContent = yamlMapper.writeValueAsString(swaggerData);
        
        String outputPath = "build/api-docs/swagger.yaml";
        File outputFile = new File(outputPath);
        outputFile.getParentFile().mkdirs();
        
        try (FileWriter writer = new FileWriter(outputFile)) {
            writer.write(yamlContent);
        }
    }
}

3. 配置Gradle任务

在build.gradle中添加自定义任务,执行上述测试:

// 生成Swagger文档的任务
task generateSwaggerDocs(type: Test) {
    // 指定仅执行Swagger生成的测试类
    include '**/SwaggerStaticGeneratorTest.class'
    // 声明输出目录,帮助Gradle识别增量构建
    outputs.dir file('build/api-docs')
}

// 可选:让build任务自动触发文档生成
build.dependsOn generateSwaggerDocs

执行方式

运行以下命令即可生成文件:

./gradlew generateSwaggerDocs

生成的文件会存放在build/api-docs目录下。

方案二:通过独立Main类生成

如果不想依赖测试环境,可以编写一个独立的Main类启动应用并生成文档:

1. 编写Main类

在主源码目录下创建SwaggerGeneratorMain.java:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.client.RestTemplate;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

@SpringBootApplication
public class SwaggerGeneratorMain {
    public static void main(String[] args) throws IOException {
        // 启动Spring应用上下文
        ConfigurableApplicationContext context = SpringApplication.run(SwaggerGeneratorMain.class, args);
        RestTemplate restTemplate = new RestTemplate();
        
        // 调用Swagger端点(注意端口需与应用配置一致,可在application.properties中临时指定)
        String swaggerJson = restTemplate.getForObject("http://localhost:8081/v1/api-docs", String.class);
        
        // 保存JSON文件
        String outputPath = "build/api-docs/swagger.json";
        File outputFile = new File(outputPath);
        outputFile.getParentFile().mkdirs();
        
        try (FileWriter writer = new FileWriter(outputFile)) {
            writer.write(swaggerJson);
        }
        
        // 关闭应用上下文
        context.close();
    }
}

2. 配置Gradle任务

在build.gradle中添加执行该Main类的任务:

task generateSwaggerDocs(type: JavaExec) {
    mainClass = 'com.your.package.SwaggerGeneratorMain' // 替换为你的类全路径
    classpath = sourceSets.main.runtimeClasspath
    outputs.dir file('build/api-docs')
}

执行方式

运行以下命令:

./gradlew generateSwaggerDocs

注意:这种方式需要确保应用启动端口未被占用,建议在application.properties中临时指定一个专用端口,比如server.port=8081。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:10:27