我面临一个问题,使用gradle swagger生成器插件生成的代码由于未解决的依赖关系而无法编译。
我有一个多模块渐变项目,具有以下文件夹结构parent是具有三个子项目的父项目,这些子项目名为模块:api、modules:api client和modules: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 build
或modulesapi-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
(生成您需要的代码