Как сгенерировать swagger.json с помощью Gradle?

Я хочу использовать swagger-codegen для создания клиентов REST и, возможно, статической HTML-документации.

Однако swagger-codegen требует для ввода swagger.json.

Я знаю, что могу получить это на работающем сервере REST, оснащенном Swagger.

Но есть ли способ получить swagger.json непосредственно из моего Java-кода, т.е. сгенерировать его с помощью gradle из исходного кода, без необходимости запускать приложение в веб-контейнере и указывать на него curl или браузер?


person tbsalling    schedule 21.09.2016    source источник
comment
Я все еще изучаю это.   -  person tbsalling    schedule 22.09.2016
comment
github.com/gigaSproule/swagger-gradle-plugin Вы пробовали этот плагин? Он утверждает, что делает именно то, о чем вы просите.   -  person Doron Gold    schedule 12.03.2017
comment
При использовании swagger-gradle-plugin я столкнулся со следующей ошибкой: com.fasterxml.jackson.databind.JsonMappingException: нет содержимого для сопоставления из-за окончания ввода в [Источник: UNKNOWN; строка: 1, столбец: 0]   -  person lex    schedule 21.12.2017


Ответы (2)


Это немного устарело, но мне было интересно точно так же ... Короче говоря, я начал исследование с:

  • Пример приложения Spring Boot с минималистичным REST API;
  • Аннотации Swagger к методам API;
  • Springfox;
  • Gradle как инструмент сборки;

Мне удалось сгенерировать спецификацию JSON как артефакт сборки, используя два разных подхода:

  1. Используя порт градиента swagger-maven-plugin от kongchen.
  2. (Не уверен, что это засчитывается, потому что он все равно запускает сервер) Выполняя интеграционный тест (макет MVC Spring), который генерирует спецификацию. Я позаимствовал идею из здесь.

Я обобщил свои исследования в простом проекте, который находится здесь. См. Раздел Automation. Код и примеры включены.

person Lachezar Balev    schedule 23.05.2017

Основная идея - добавить swagger-maven-plugin и ваши классы java в путь к классам, чтобы buildScript мог использовать их в градиенте, примерно так:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath files(project(':swagger-maven-example').configurations['runtime'].files)
        classpath files(project(':swagger-maven-example').sourceSets['main'].output.classesDir)
    }
}

где первая строка в зависимостях получает библиотеки swagger из подпроекта, а вторая строка получает ваши классы, которые должны содержать аннотации swagger.

После этого вы можете вызвать плагин maven в градиенте как простой класс 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: '[email protected]',
                                        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()

Здесь вы можете найти этот пример.

person Uladzimir Zhuraulevich    schedule 05.10.2016
comment
он сломан в текущих версиях весенней загрузки. посоветовать - person JBarros35; 27.09.2020