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

Spring Boot + Gradleでswagger-codegen-cli自動生成ソースを出力する方法
項目 バージョン
swagger-codegen-cli v3.0.21

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

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

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

https://github.com/swagger-api/swagger-codegen/tree/v3.0.21

上記より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

view raw
gistfile1.txt
hosted with ❤ by GitHub

taskを追加します。

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'

view raw
build.gradle
hosted with ❤ by GitHub

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

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

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

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

マルチプロジェクト

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

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

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

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

view raw
settings.gradle
hosted with ❤ by GitHub

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'
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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

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

Default: okhttp-gson

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

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

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')
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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_"
}

view raw
client.json
hosted with ❤ by GitHub

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

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

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

サンプルソース

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA