Как создать swagger.json, используя gradle?
Я хочу использовать swagger-codegen для генерации REST-клиентов и, возможно, статической HTML-документации.
Однако для ввода swagger-codegen требуется файл swagger.json.
Я знаю, что я могу получить это с работающего сервера REST, оборудованного Swagger.
Но есть ли способ получить swagger.json напрямую из моего Java-кода - т.е. сгенерировать его с помощью gradle из исходного кода - без необходимости запускать приложение в веб-контейнере и указывать curl
или браузер к нему?
2 ответа
Это немного устарело, но мне было интересно то же самое... Короче, я начал исследование с:
- Пример приложения Spring Boot, демонстрирующий минималистичный REST API;
- Swagger аннотации на методы API;
- Springfox;
- Gradle как инструмент для сборки;
Мне удалось сгенерировать спецификацию JSON как артефакт сборки, используя два разных подхода:
- Используя порт Gradle из Swagger-Maven-плагин kongchen.
- (Не уверен, что это считается, потому что он в любом случае запускает сервер). Выполнение интеграционного теста (макет Spring MVC), который генерирует спецификацию. Я заимствовал идею отсюда.
Я подвел итог моего исследования в простом проекте, расположенном здесь. Увидеть Automation
раздел. Код и примеры включены.
Основная идея состоит в том, чтобы добавить swagger-maven-plugin и ваши java-классы в classpath для buildScript, чтобы иметь возможность использовать их в gradle, что-то вроде этого:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath files(project(':swagger-maven-example').configurations['runtime'].files)
classpath files(project(':swagger-maven-example').sourceSets['main'].output.classesDir)
}
}
где первая строка в зависимостях получает swagger libs из подпроекта, а вторая строка получает ваши классы, которые должны содержать аннотации swagger.
После этого вы можете вызвать плагин Maven в Gradle как простой Java-класс:
// a trick to have all needed classes in the classpath
def customClass = new GroovyClassLoader()
buildscript.configurations.classpath.each {
// println it.toURI().toURL()
customClass.addURL(it.toURI().toURL())
}
final ApiDocumentMojo mavenTask = Class.forName('com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo',true, customClass).newInstance(
apiSources: [
new ApiSource(
springmvc: false,
locations: ['com/github/kongchen/swagger/sample/wordnik/resource'],
schemes: ['http', 'https'],
host: 'petstore.swagger.wordnik.com',
basePath: '/api',
info: new Info(
title: 'Swagger Maven Plugin Sample',
version: 'v1',
description: 'This is a sample for swagger-maven-plugin',
termsOfService: 'http://www.github.com/kongchen/swagger-maven-plugin',
contact: new Contact(
email: 'kongchen@gmail.com',
name: 'Kong Chen',
url: 'http://kongch.com'
),
license: new License(
url: 'http://www.apache.org/licenses/LICENSE-2.0.html',
name: 'Apache 2.0'
)
),
outputPath: file("${buildDir}/swagger/document.html").path,
swaggerDirectory: file("${buildDir}/swagger/swagger-ui").path,
templatePath: file("${project(':swagger-maven-example').projectDir}/templates/strapdown.html.hbs")
)
]
)
// maven plugin
mavenTask.execute()
Здесь вы можете найти этот пример.