Gradle 升级 7.2 > 7.3 中断,“此属性的值是最终的,不能进一步更改”(使用 Micronaut 插件?)

Chr*_*ian 5 gradle gradle-plugin micronaut

我使用 Micronaut 3.1.3 和 Gradle 7.2 来构建我的项目。

切换到 Gradle 7.3后,内置中断会发出一些上下文无关的错误消息:

$ ./gradlew clean build
Executed by Gradle 7.3
- using Java 11.0.13
- using Kotlin 1.5.31
- using Groovy 3.0.9

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project '[PROJECT]'.
> The value for this property is final and cannot be changed any further.
Run Code Online (Sandbox Code Playgroud)

随着--stacktrace一条很长的痕迹出现。以下摘录让我猜测问题可能出在 Micronaut 插件上:

* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project '[PROJECT]'.
        at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:75)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:68)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:51)
        [...]
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)
Caused by: java.lang.IllegalStateException: The value for this property is final and cannot be changed any further.
        at org.gradle.api.internal.provider.AbstractProperty$FinalizedValue.beforeMutate(AbstractProperty.java:489)
        at org.gradle.api.internal.provider.AbstractProperty.assertCanMutate(AbstractProperty.java:263)
        at org.gradle.api.internal.provider.AbstractProperty.setSupplier(AbstractProperty.java:212)
        at org.gradle.api.internal.provider.DefaultProperty.set(DefaultProperty.java:71)
        at org.gradle.api.tasks.testing.Test.useTestFramework(Test.java:979)
        at org.gradle.api.tasks.testing.Test.useJUnitPlatform(Test.java:1049)
        at org.gradle.api.tasks.testing.Test.useJUnitPlatform(Test.java:1032)
        at io.micronaut.gradle.MicronautLibraryPlugin.lambda$null$1(MicronautLibraryPlugin.java:103)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
        [...]
        at org.gradle.api.internal.DefaultDomainObjectCollection.withType(DefaultDomainObjectCollection.java:201)
        at io.micronaut.gradle.MicronautLibraryPlugin.lambda$apply$4(MicronautLibraryPlugin.java:101)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
        [...]
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)
Run Code Online (Sandbox Code Playgroud)

由于“配置根项目时出现问题”,我不确定我的哪一部分 build.gradle引发了问题。因此,根据我对 Micronaut 插件的第一次猜测,以下摘录告诉您正在使用的插件列表以及该插件的配置:

plugins {
  id('org.jetbrains.kotlin.jvm') version "${kotlinVersion}"
  id('groovy')
  id('org.jetbrains.kotlin.kapt') version "${kotlinVersion}"
  id('com.github.johnrengelman.shadow') version '7.+'
  id('io.micronaut.application') version '2.+'
  id('org.jetbrains.kotlin.plugin.allopen') version "${kotlinVersion}"
  id('com.google.cloud.tools.jib') version '3.+'
  id('org.openapi.generator') version '5.+'
  id('com.heroku.sdk.heroku-gradle') version '2.+'
}

[...]

micronaut {
  runtime('netty')
  testRuntime('spock2')
  processing {
    incremental(true)
    annotations('[PACKAGE]')
  }
}
Run Code Online (Sandbox Code Playgroud)

也许这提供了足够的信息来解决问题的原因?如果没有,请告诉我。

问候

小智 2

I hit the same issue with my Java build and asked for help on gradle slack channel. It found to be a change in Gradle 7.3 behavior.

This issue contains an explanation of the cause and how to fix it. It helped me to solve the issue with my build: I had options defined in one of the test tasks and then useJUnitPlatform was applied across all test tasks afterwards using this snippet:

tasks.withType(Test).configureEach {
  useJUnitPlatform()    // <-- this line was breaking the build
}
Run Code Online (Sandbox Code Playgroud)

This broke the build after migrating to Gradle 7.3. Removing options solved the problem for me.

这里有一个问题,要求在 Gradle 7.3 中将此破坏性行为转换为警告,并使其成为 8.0 中的破坏性更改。