Spring Boot + Gradleでswagger-codegen-cli自動生成ソースを出力する方法
項目 | バージョン |
---|---|
swagger-codegen-cli | v3.0.21 |
https://editor.swagger.io/にyamlを貼り付けて、スタブサーバやクライアントソースを自動生成することができます。
これをGradleタスクで自動生成してみます。(自動生成時にカスタマイズすることも可能です)
上記よりswagger-codegen-cli-3.0.21.jarをダウンロードします。
Gradleプロジェクトを作成する
STS(Eclipse)でスケルトンのGradleプロジェクトを作成します。
プロジェクト直下に以下配置します。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で指定したタスクが実行されます。
プロジェクト直下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」と記述して実行します。
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ローカルリポジトリにデプロイされるようになります。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント