web-dev-qa-db-fra.com

Comment générer swagger.json en utilisant gradle?

Je veux utiliser swagger-codegen pour générer des clients REST et éventuellement de la documentation HTML statique.

Cependant, swagger-codegen a besoin de swagger.json pour la saisie.

Je suis conscient que je peux l'obtenir à partir d'un serveur REST équipé de Swagger.

Mais existe-t-il un moyen d'obtenir swagger.json directement à partir de mon Java - c'est-à-dire de le générer avec gradle à partir du code source - sans avoir besoin d'exécuter l'application dans un conteneur Web et de pointer curl ou un navigateur?

18
tbsalling

C'est un peu vieux mais je me demandais exactement la même chose ... Bref j'ai commencé la recherche avec:

  • Un exemple d'application Spring Boot exposant minimaliste REST API;
  • Annotations Swagger sur les méthodes API;
  • Springfox;
  • Gradle comme outil de construction;

J'ai réussi à générer la spécification JSON comme un artefact de construction en utilisant deux approches différentes:

  1. En utilisant un port gradle du plugin swagger-maven de kongchen .
  2. (Je ne sais pas si cela compte, car il démarre de toute façon un serveur) En exécutant un test d'intégration (Spring's mock MVC) qui génère la spécification. J'ai emprunté l'idée à ici .

J'ai résumé mes recherches dans un projet simple situé ici . Voir la section Automation. Le code et les exemples sont inclus.

7
Lachezar Balev

L'idée principale est d'ajouter swagger-maven-plugin et vos classes Java dans classpath pour que buildScript puisse les utiliser dans le gradle, quelque chose comme ceci:

buildscript {
    repositories {
        mavenCentral()
    }

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

où la première ligne dans les dépendances obtient les bibliothèques swagger du sous-projet et la deuxième ligne obtient vos classes qui devraient contenir des annotations swagger.

Après cela, vous pouvez appeler le plugin maven dans le gradle comme une simple classe 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()

Ici vous pouvez trouver cet exemple.