客户端由运行时代码生成器和ClassNotFoundException错误生成

时间:2019-01-29 10:51:51

标签: spring gradle swagger-codegen

我一直在尝试使用由swagger代码生成的swagger客户端与我的spring boot应用程序中的另一个服务进行通信,但是我在运行时收到一个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

最后,如果我提供了所有必要的依赖项,它将起作用。错误的数量取决于生成摇摇欲坠的客户端代码的方式。我将向您展示其中之一。


复制步骤:

生成客户端代码的命令:

java -jar swagger-codegen-cli-2.3.1.jar generate -i spec.yaml -l java -o java

然后,我运行了gradle build命令以获取带有客户端代码的 JAR 。我已放入gradle文件中的生成JAR的路径(请查看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
    }
}

您是否知道我做错了什么以及如何解决此问题?我不明白。据我了解,所有必需的依赖项都包含在生成的swagger客户端jar中(也许我错了吗?)。由于某些原因,如果我想在Spring Boot应用程序中使用此jar,则spring在运行时不会看到在swagger客户端jar中使用的这些依赖项。

0 个答案:

没有答案