无法编译使用gradle swagger生成器插件生成的代码



我面临一个问题,使用gradle swagger生成器插件生成的代码由于未解决的依赖关系而无法编译。

我有一个多模块渐变项目,具有以下文件夹结构parent是具有三个子项目的父项目,这些子项目名为模块:apimodules:api clientmodules:common

.
├── parent
│   ├── build.gradle
│   ├── gbuild
│   ├── gradle
│   │   └── wrapper
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── modules
│   │   ├── apis
│   │   │   ├── build.gradle.kts
│   │   │   ├── gbuild
│   │   │   └── src
│   │   ├── api-client (generated)
│   │   │   ├── README.md
│   │   │   ├── build.gradle
│   │   │   ├── build.sbt
│   │   │   ├── docs
│   │   │   ├── gbuild
│   │   │   ├── git_push.sh
│   │   │   ├── gradle
│   │   │   ├── gradle.properties
│   │   │   ├── gradlew
│   │   │   ├── gradlew.bat
│   │   │   ├── pom.xml
│   │   │   ├── settings.gradle
│   │   │   └── src
│   │   └── common
│   │       ├── build.gradle.kts
│   │       ├── gbuild
│   │       └── src
│   ├── project_version.properties
│   └── settings.gradle.kts

Module:modules:apis是我想要为其生成客户端SDK的spring-boot REST服务。模块:模块:api客户端是生成客户端代码的占位符项目。

modules/apis/build.gradle.kts的相关章节如下所示。

plugins {
// Some plugins omitted for clarity
java
id("org.springframework.boot")
id("io.spring.dependency-management")

id("org.hidetake.swagger.generator") version "2.18.2"
}
dependencies {
// Other dependencies omitted
implementation (Libs.io_swagger_core)
swaggerCodegen("io.swagger.codegen.v3:swagger-codegen-cli:3.0.27")
}
swaggerSources {
create("testcode") {
// File api-spec is already generated and placed at the right location.
setInputFile(file("$projectDir/src/main/resources/swagger/api-spec.json"))
code(
closureOf<org.hidetake.gradle.swagger.generator.GenerateSwaggerCode> {
wipeOutputDir = true
language = "java"
configFile = file("$projectDir/src/main/resources/swagger/api-config.json")
outputDir = file(
"$rootDir/modules/client"
)
}
)
}
}
tasks.named("build") { dependsOn("generateSwaggerCode") }

工作原理:我可以使用modulesapis中的gradle clean build生成客户端代码,并使用.gradle.bat clean buildmodulesapi-client中的gradle clean build构建它。

不起作用:当我使用父文件夹中的.gradlew build --no-daemon --stacktrace --info构建项目时,任务:modules:api-client:compileJava仅在第一次运行时失败,并出现编译器错误。编译失败,因为gradle无法从modulesapi-clientbuild.gradle解析依赖项。在所附文件中可以找到编译器错误。

但是,在手动删除modules\api客户端文件夹之前,使用相同命令的后续构建会顺利成功。

项目使用的渐变版本

pathtoparent> .gradlew.bat --version                                                                                                                                         
------------------------------------------------------------
Gradle 6.7
------------------------------------------------------------
Build time:   2020-10-14 16:13:12 UTC
Revision:     312ba9e0f4f8a02d01854d1ed743b79ed996dfd3
Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          1.8.0_181 (Oracle Corporation 25.181-b13)
OS:           Windows 10 10.0 amd64

使用的Gradle版本:模块:api客户端子项目

pathtoparentmodulesapi-client> .gradlew.bat --version                                                                                                                          
------------------------------------------------------------
Gradle 2.6
------------------------------------------------------------
Build time:   2015-08-10 13:15:06 UTC
Build number: none
Revision:     233bbf8e47c82f72cb898b3e0a96b85d0aad166e
Groovy:       2.3.10
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_181 (Oracle Corporation 25.181-b13)
OS:           Windows 10 10.0 amd64

我在选项--build-cache--no-parallel的所有四个组合中都尝试过,但得到了相同的结果。我对gradle还比较陌生,我胡乱猜测这两个选项可能在这个问题中发挥了作用。

如能为解决此问题提供任何帮助,我们将不胜感激。

谢谢Anand

您应该将生成的类放在buildDir中(因为您不想在每次生成时对它们进行修改(,然后您需要将生成的类添加到sourceSet中。

在您的build.gradle.kts中添加以下内容:

configure<SourceSetContainer> {
named("main") {
java.srcDir("$buildDir/generated/src/main/java")
}
}

路径是您在招摇生成任务中指定的路径。同样在我的案例中,我设置了对KotlinCompile任务的依赖:

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
dependsOn("generateSwaggerCode")
kotlinOptions.jvmTarget = "11"
}

确保这个";generateSwangerCode";通过(./gradlew generateSwaggerCode(生成您需要的代码

最新更新