Я пытался использовать swagger-клиент, сгенерированный swagger codegen, для связи с другим сервисом в моем приложении для весенней загрузки, но я получаю ошибку ClassNotFoundException
во время выполнения.
Если я предоставляю пропущенныйзависимость от файла Gradle, я получаю еще одну аналогичную ошибку (еще ClassNotFoundException
).Снова и снова:
java.lang.ClassNotFoundException: okio.Source
java.lang.ClassNotFoundException: com.squareup.okhttp.Callback
java.lang.ClassNotFoundException: com.google.gson.JsonParseException
java.lang.ClassNotFoundException: org.threeten.bp.temporal.TemporalAccessor
java.lang.ClassNotFoundException: io.gsonfire.GsonFireBuilder
Наконец, если я предоставлю все необходимые зависимости, это сработает.Количество ошибок зависит от способа генерации кода клиента swagger.Я покажу вам один из них.
Шаги для воспроизведения:
Команда для генерации кода клиента:
java -jar swagger-codegen-cli-2.3.1.jar generate -i spec.yaml -l java -o java
Затем я запустил gradle build
команда для получения JAR с кодом клиента.Путь к сгенерированному JAR-файлу, который я поместил в свой файл Gradle (см. compile files(...)
:
plugins {
id 'org.springframework.boot' version '2.1.2.RELEASE'
}
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'war'
apply plugin: 'idea'
apply plugin: 'io.spring.dependency-management'
group 'test'
version '1.0'
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
repositories {
mavenCentral()
}
ext {
springBootVersion = '2.1.2.RELEASE'
lombokVersion = '1.18.4'
groovyVersion = '2.5.5'
spockVersion = '1.2-groovy-2.5'
spockReportsVersion = '1.6.1'
swaggerVersion = '2.9.2'
}
dependencies {
providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.codehaus.groovy:groovy-all:${groovyVersion}")
compile files('/codegen/java/build/libs/swagger-java-client-1.0.0.jar')
compileOnly("org.projectlombok:lombok:${lombokVersion}")
testCompileOnly("org.projectlombok:lombok:${lombokVersion}")
annotationProcessor("org.projectlombok:lombok:${lombokVersion}")
testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.spockframework:spock-core:${spockVersion}")
testImplementation("org.spockframework:spock-spring:${spockVersion}")
testImplementation("com.athaydes:spock-reports:${spockReportsVersion}") {
transitive = false // this avoids affecting your version of Groovy/Spock
}
}
У вас есть идеи, что я делаю неправильно и как решить эту проблему? Я делаюЯ не понимаю этого. Как я понимаю, все необходимые зависимости включены в сгенерированный клиентский jar-файл swagger (может, я ошибаюсь?). По некоторым причинам, если я хочу использовать этот jar-файл в моем загрузочном приложении Spring, Spring не видит этих зависимостей., которые используются в клиентском банке swagger во время выполнения.