Spring Cloud Contract generateClientStubs任务失败求助
问题:Spring Cloud Contract生产者端generateClientStubs任务执行失败
我正在搭建Spring Cloud Contract生产者端,已添加所需插件,合约文件放置在contracts目录中,构建时插件能正确识别该目录,Gradle构建过程也已将合约正确复制到stubs目录的contracts文件夹下,但执行generateClientStubs任务时出现以下错误:
控制台错误日志
> Task :[ProjectName]:generateClientStubs FAILED Build cache key for task ':[ProjectName]:generateClientStubs' is 3cc52dc492987e9244ab97e5274ad851 Task ':[ProjectName]:generateClientStubs' is not up-to-date because: Task has failed previously. Stubs output dir [/home/username/Projects/[ProjectName]/build/stubs/META-INF/[ProjectName]/[ProjectName]/2.4.9/mappings] Spring Cloud Contract Verifier Plugin: Invoking DSL to client stubs conversion Contracts dir is [/home/username/Projects/[ProjectName]/[ProjectName]/build/stubs/META-INF/[ProjectName]/[ProjectName]/2.4.9/contracts] output stubs dir is [/home/username/Projects/[ProjectName]/[ProjectName]/build/stubs/META-INF/[ProjectName]/[ProjectName]/2.4.9/mappings] :[ProjectName]:generateClientStubs (Thread[Execution worker for ':' Thread 6,5,main]) completed. Took 0.003 secs. FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':common-services-service:generateClientStubs'. > org.gradle.process.JavaExecSpec.getMainClass()Lorg/gradle/api/provider/Property;
Gradle配置文件(build.gradle)
plugins{ id 'org.springframework.cloud.contract' version '3.1.6' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:2021.0.5" } } ext { set('springCloudVersion', "2021.0.6") } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier' } tasks.named('contractTest') { useJUnitPlatform() } tasks.named('test') { useJUnitPlatform() } // tasks.create(type: Jar, name: 'verifierStubsJartest', dependsOn: 'generateClientStubs') { // baseName = project.name // classifier = contracts.stubsSuffix // from contractVerifier.stubsOutputDir // } contracts { testMode = 'Explicit' // contractsDslDir = file("/src/contractTest/resources/contracts") // testFramework = "JUNIT5" // packageWithBaseClasses = 'com.example.SCCProducer' baseClassForTests='com.subex.ngp.sccBaseContractClass'; generatedTestSourcesDir = project.file('src/generatedContract') // baseClassMappings { // baseClassMapping(".*intoxication.*", "com.example.intoxication.contractBaseClass") // } }
合约文件(TestingContact.groovy)
package contracts import org.springframework.cloud.contract.spec.Contract Contract.make { request { method 'GET' url [url is correct and working ] } response { status OK() } }
解决建议
1. 修复Gradle版本兼容性问题
报错org.gradle.process.JavaExecSpec.getMainClass()Lorg/gradle/api/provider/Property;是典型的Gradle版本与Spring Cloud Contract插件版本不兼容导致的:
- Spring Cloud Contract 3.1.x系列要求Gradle 7.0及以上版本,如果你当前使用的是Gradle 6.x或更低版本,会出现该反射错误(因为
JavaExecSpec.getMainClass()在Gradle 7.x才返回Property<String>,旧版本返回的是String类型)。 - 检查你的Gradle版本(执行
./gradlew --version),如果低于7.0,升级Gradle到7.x或更高版本。
2. 统一Spring Cloud版本配置
当前配置中dependencyManagement引入的Spring Cloud BOM版本是2021.0.5,但ext里又设置了springCloudVersion=2021.0.6,版本不一致可能引发潜在问题,建议统一为同一个版本:
dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:2021.0.6" } } ext { set('springCloudVersion', "2021.0.6") }
3. 验证合约文件语法
确保合约中的url配置语法正确,比如替换占位的[url is correct and working ]为实际有效的URL路径,示例:
url '/api/test' // 或带参数的写法 url('/api/test') { queryParameters { param 'id', 123 } }
内容的提问来源于stack exchange,提问作者Gurushanth Gowdar
相关产品推荐
相关产品推荐

