Gradle 5.0导致在buid.Gradle.kts中使用Kotlin DSL时无法重新分配错误Val
此错误在gradle版本4.10.2中没有发生 行Gradle 5.0导致在buid.Gradle.kts中使用Kotlin DSL时无法重新分配错误Val,gradle,kotlin,Gradle,Kotlin,此错误在gradle版本4.10.2中没有发生 行classDirectories=files(filesToCover)导致gradle抛出错误: * What went wrong: Script compilation error: Line 80: classDirectories = files(filesToCover) ^ Val cannot be reassigned 但是当您查看底层Java类Jac
classDirectories=files(filesToCover)
导致gradle抛出错误:
* What went wrong:
Script compilation error:
Line 80: classDirectories = files(filesToCover)
^ Val cannot be reassigned
但是当您查看底层Java类JacocoReportBase
时,您可以清楚地看到有一个setter,并且类属性不是final
public abstract class JacocoReportBase extends JacocoBase {
private FileCollection executionData;
private FileCollection sourceDirectories;
private FileCollection classDirectories;
private FileCollection additionalClassDirs;
private FileCollection additionalSourceDirs;
...
public void setClassDirectories(FileCollection classDirectories) {
this.classDirectories = classDirectories;
}
build.gradle.kts
tasks {
withType<KotlinCompile<KotlinJvmOptions>> {
kotlinOptions.freeCompilerArgs = listOf("-Xjsr305=strict")
kotlinOptions.jvmTarget = "1.8"
}
withType<JacocoReport> {
reports {
xml.isEnabled = false
csv.isEnabled = false
html.destination = file("$buildDir/jacocoHtml")
}
afterEvaluate {
val filesToAvoidForCoverage = listOf(
"/dto",
"/config",
"AuthenticationMicroServiceKt.class"
)
val filesToCover = mutableListOf<String>()
File("build/classes/kotlin/main/app/example/core/")
.walkTopDown()
.mapNotNull { file ->
var match = false
filesToAvoidForCoverage.forEach {
if (file.absolutePath.contains(it)) {
match = true
}
}
return@mapNotNull if (!match) {
file.absolutePath
} else {
null
}
}
.filter { it.contains(".class") }
.toCollection(filesToCover)
classDirectories = files(filesToCover) // error
}
}
}
任务{
withType{
Kotlinoctions.freeCompilerArgs=listOf(“-Xjsr305=strict”)
kotlinOptions.jvmTarget=“1.8”
}
withType{
报告{
xml.isEnabled=false
csv.isEnabled=false
html.destination=文件(“$buildDir/jacochtml”)
}
后评价{
val filesToAvoidForCoverage=listOf(
“/dto”,
“/config”,
“AuthenticationMicroServiceKt.class”
)
val filesToCover=mutableListOf()
文件(“build/classes/kotlin/main/app/example/core/”)
.walkTopDown()
.mapNotNull{file->
var匹配=false
filesToAvoidForCoverage.forEach{
if(file.absolutePath.contains(it)){
匹配=真
}
}
return@mapNotNull如果(!匹配){
file.absolutePath
}否则{
无效的
}
}
.filter{it.contains(“.class”)}
.toCollection(filesToCover)
classDirectories=files(filesToCover)//错误
}
}
}
我还在Github上发布了一个问题,让我们看看:
如您所见,getClassDirectories
的返回类型为ConfigurableFileCollection
和setClassDirectories
接受FileCollection
。所以这不是一个有效的JavaBeans属性,因为getter和setter操作不同的类型。所以Kotlin只看到了getter,它实际上是一个val
您可以尝试直接调用setClassDirectories
(setClassDirectories(…)
而不是classDirectories=…
),或者按照Javadocs的建议使用classDirectories.setFrom
它在4.10.2中工作,因为它(getter和setter类型相同)。事情发生了变化。
val
必须是var
才能放弃它。
/**
* Source sets that coverage should be reported for.
*/
@PathSensitive(PathSensitivity.RELATIVE)
@InputFiles
public ConfigurableFileCollection getClassDirectories() {
return classDirectories;
}
/**
* Classes that coverage should be reported for.
* @deprecated Use {@code getClassDirectories().setFrom(...)}
*/
@Deprecated
public void setClassDirectories(FileCollection classDirectories) {
DeprecationLogger.nagUserOfDiscontinuedMethod("JacocoReportBase.setClassDirectories(FileCollection)", "Use getClassDirectories().from(...)");
this.classDirectories.setFrom(classDirectories);
}