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(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^






コメント