Spring Boot + Gradleでswagger-codegen-cli自動生成ソースを出力する方法

Spring Boot + Gradleでswagger-codegen-cli自動生成ソースを出力する方法

項目バージョン
swagger-codegen-cliv3.0.21

https://editor.swagger.io/にyamlを貼り付けて、スタブサーバやクライアントソースを自動生成することができます。

Spring Boot + Gradleでswagger-codegen-cli自動生成ソースを出力する方法

これをGradleタスクで自動生成してみます。(自動生成時にカスタマイズすることも可能です)

GitHub - swagger-api/swagger-codegen at v3.0.21
swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagg...

上記よりswagger-codegen-cli-3.0.21.jarをダウンロードします。

Gradleプロジェクトを作成する

STS(Eclipse)でスケルトンのGradleプロジェクトを作成します。

Spring Boot + Gradleでswagger-codegen-cli自動生成ソースを出力する方法

プロジェクト直下に以下配置します。in.yamlがSwagger Editorに張り付けるyamlとします。

in/in.yaml
libs/swagger-codegen-cli-3.0.21.jar

taskを追加します。

mainにio.swagger.codegen.v3.cli.SwaggerCodegenを指定します。

build.gradle

plugins {
  id 'java-library'
}
dependencies {
  implementation files('libs/swagger-codegen-cli-3.0.21.jar')
}
task genClient(type: JavaExec) {
  main = "io.swagger.codegen.v3.cli.SwaggerCodegen"
  classpath = sourceSets.main.runtimeClasspath
  args("generate","-i","in/in.yaml","-l","java","-o","clients")
  doLast {
    delete file('clients/settings.gradle')
    delete file('clients/build.gradle')
  }
}

defaultTasks 'genClient'

追加したタスクを上記末尾のdefaultTasksでタスクを指定します。参考サイト:デフォルトタスク

これで「実行の構成」からタスク未指定で実行すると、defaultTasksで指定したタスクが実行されます。

Spring Boot + Gradleでswagger-codegen-cli自動生成ソースを出力する方法

プロジェクト直下clientフォルダ配下にJavaの自動生成ソースが作成されているはずです。

マルチプロジェクト

Gradleプロジェクトはマルチプロジェクトなので、自動生成したソースをサブプロジェクト(clientsフォルダ)としてビルドすることが出来ます。

自動生成したサブプロジェクトをclientsというプロジェクト名とします。

settings.gradleに以下のようにinclude文を1行追記します。

rootProject.name = 'multi-gradle-project'
include 'clients'

build.gradleにサブプロジェクト用のprojectを追加します。

project(':clients') {
  apply plugin: 'maven'
  apply plugin: 'java-library'
  tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
  }
  repositories {
    mavenCentral()
    maven{
      url 'c:/maven/repository' // ローカルリポジトリ
    }
  }
  sourceCompatibility = JavaVersion.VERSION_1_7
  targetCompatibility = JavaVersion.VERSION_1_7
  uploadArchives {
    repositories {
      mavenDeployer {
        repository(url: "file:/maven/repository/") // file:とすること
        pom.version = '1.0.0'
        pom.artifactId = 'clients'
        pom.groupId = 'jp.co.confrage'
      }
    }
  }
  ext {
    swagger_annotations_version = "2.0.0"
    jackson_version = "2.8.9"
    spring_web_version = "4.3.9.RELEASE"
    jodatime_version = "2.9.9"
    junit_version = "4.12"
    jackson_threeten_version = "2.6.4"
  }
  dependencies {
    compile "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version"
    compile "org.springframework:spring-web:$spring_web_version"
    compile "com.fasterxml.jackson.core:jackson-core:$jackson_version"
    compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version"
    compile "com.fasterxml.jackson.core:jackson-databind:$jackson_version"
    compile "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:$jackson_version"
    compile "com.github.joschi.jackson:jackson-datatype-threetenbp:$jackson_threeten_version"
    compile 'javax.annotation:javax.annotation-api:1.3.2'
    testCompile "junit:junit:$junit_version"
  }
  defaultTasks 'uploadArchives'
}

「実行の構成」からタスクに「:clients:uploadArchives」と記述して実行します。

Spring Boot + Gradleでswagger-codegen-cli自動生成ソースを出力する方法

Default: okhttp-gson

library templateはデフォルトokhttp-gsonの為、クライアントコード生成時に「エラー: シンボルを見つけられません」などのエラーが発生します。-c config.jsonでresttemplateを指定します。Springの場合はresttemplateを指定しないとエラーとなるようです。

コンフィグのヘルプは以下で確認できます。

java -jar swagger-codegen-cli-3.0.xx.jar config-help -l java

taskを以下のように-cオプションでconfig.json(任意のjsonファイル名でOK)を指定します。

task genClient(type: JavaExec) {
  main = "io.swagger.codegen.v3.cli.SwaggerCodegen"
  classpath = sourceSets.main.runtimeClasspath
  args("generate","-i","in/in.yaml","-l","java","-c","client.json","-o","clients")
  doLast {
    delete file('clients/settings.gradle')
    delete file('clients/build.gradle')
  }
}

config.jsonをプロジェクト直下(build.gradleと同じ階層)に配置します。-cオプションでconfig.jsonを使いたくない場合は「Spring Boot でSwagger を使う方法」を参照ください。

“library”:”resttemplate”を指定します。

{
  "apiPackage" : "jp.co.confrage.client.api.hoge",
  "modelPackage" : "jp.co.confrage.client.api.hoge.model",
  "invokerPackage" : "jp.co.confrage.client.api.hoge.invoker",
  "artifactId" : "clients",
  "library" : "resttemplate",
  "localVariablePrefix": "local_"
}

再度サブプロジェクトのタスク(:clients:uploadArchives)を実行します。

これでMavenローカルリポジトリにデプロイされるようになります。

マルチプロジェクトのビルド

サンプルソース

コメント

タイトルとURLをコピーしました