Gradle升级至7.4.2遇配置容器未知属性'compile'错误求助
Gradle 7.4.2升级后
configurations.compile报错的解决方法 问题背景
升级Gradle至7.4.2后,构建时触发错误:
评估根项目'service'时出现问题:无法获取类型为org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer的配置容器的未知属性'compile'。
错误来自war任务的Manifest配置段,原代码如下:
war{ archiveName 'xyz-svc-clt.war' manifest{ attributes "Weblogic-Application-Version": getBuildVersion(), "Built-By": "${env.USERNAME}", "Built-On": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), "Class-Path": configurations.compile.collect { it.getName() }.join(' ') } if (isDev() == false){ rootSpec.exclude("**/*_log4j.xml") rootSpec.exclude("**/*.properties") } from('src/main/resources/'){ include 'handler-chain.xml' into 'WEB-INF/classes/com/abc/xyz/service/xyzService/' } from('src/main/resources/'){ include 'handler-chain.xml' into 'WEB-INF/classes/com/abc/xyz/service/xyzService/notification/' } }
尝试将configurations.compile替换为configurations.implementation,并添加project.configurations.implementation.setCanBeResolved(true)后问题仍未解决,当前项目使用插件:
apply plugin: 'java' apply plugin: 'war'
原因分析
Gradle从5.x版本开始废弃了compile、testCompile等旧依赖配置,替换为implementation、testImplementation等新配置。但implementation属于不可解析配置,仅用于声明依赖关系,不能直接用来解析、获取依赖文件。强制设置setCanBeResolved(true)会破坏Gradle的依赖隔离设计,无法正常生效。
解决方案
创建一个可解析的自定义配置,让它继承implementation(及runtimeOnly,如果需要)的依赖,再在Manifest中使用该自定义配置收集依赖文件名。
步骤1:定义自定义可解析配置
在项目根build.gradle中添加:
configurations { // 自定义可解析配置,继承implementation的依赖 compileClasspathResolvable.extendsFrom implementation // 如果需要包含运行时依赖,可添加runtimeOnly // compileClasspathResolvable.extendsFrom implementation, runtimeOnly }
步骤2:修改war任务的Manifest配置
将原代码中的configurations.compile替换为自定义配置:
war{ archiveName 'xyz-svc-clt.war' manifest{ attributes "Weblogic-Application-Version": getBuildVersion(), "Built-By": "${env.USERNAME}", "Built-On": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), // 使用自定义可解析配置获取依赖文件名 "Class-Path": configurations.compileClasspathResolvable.collect { it.getName() }.join(' ') } // 其他原有配置保持不变 }
内容的提问来源于stack exchange,提问作者Vinda
相关产品推荐
相关产品推荐

