Gradle 包装器如何确定它使用的是哪个 Groovy 版本?

How does the Gradle wrapper determine which Groovy version it's using?

This question 没有提到包装器。

OS 是 Linux Mint 18.3.

所以对于这个项目,我从包装器中得到以下内容:

mike@M17A ~/software projects/eclipse-workspace/TM_Engine_Exp $  ./gradlew -version

------------------------------------------------------------
Gradle 5.4.1
------------------------------------------------------------

Build time:   2019-04-26 08:14:42 UTC
Revision:     261d171646b36a6a28d5a19a69676cd098a4c19d

Kotlin:       1.3.21
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          11.0.4 (Ubuntu 11.0.4+11-post-Ubuntu-116.04.1)
OS:           Linux 4.4.0-53-generic amd64

从 OS 我得到以下信息(注意,我知道这无关紧要!):

mike@M17A ~ $  groovy -version
WARNING: An illegal reflective access operation has occurred
...
Groovy Version: 2.5.8 JVM: 11.0.4 Vendor: Ubuntu OS: Linux

(请注意,如果您使用 JDK > 8,则会出现此处的警告:目前您无能为力)。

我得到以下系统的 Gradle 版本(同样无关紧要):

mike@M17A ~ $  gradle -version
WARNING: An illegal reflective access operation has occurred
...
------------------------------------------------------------
Gradle 4.8.1
------------------------------------------------------------
...
Groovy:       2.4.12
...

但是我的 build.gradle 当前包含以下依赖项:

apply plugin: 'groovy'
...
dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.5.7'
    ...

我的环境变量是:

GROOVY_HOME=/home/mike/.sdkman/candidates/groovy/current

我不确定这是怎么设置的。据我所知,那里的文件几乎肯定配置为使用 2.5.8。

所以我的问题是:包装器如何选择使用 2.5.4 以及我要去哪里找到这些 Groovy 语言文件?

另外,大概build.gradle的依赖部分的版本只适用于我的测试和构建文件(即我在Groovy中编写的),与[=46无关=] 自己的构建操作和其他任务?

注意我很想卸载我的系统 Gradle 和我的系统 Groovy,因为它们只是混淆了问题,并且只依赖于使用包装器。这是一个明智的想法吗?

Gradle 与 Groovy 捆绑在一起,不会查看您在系统上安装的其他版本。这就是为什么您在不同的 Gradle 版本中看到不同的 Groovy 版本。您无法更改此版本,因为它是 Gradle 的一部分,并且可能无法与任何其他版本一起使用。如果您好奇,可以查看 Gradle 发行版中的 "lib" 文件夹,查看 Gradle 的所有第三方库,包括 Groovy - 不要去摆弄他们。

正如您提到的,在您的构建脚本中声明了对 Groovy 的编译依赖性使得编译时使用该特定版本。这通常是您唯一应该关心的事情。 (顺便说一句,compile 已弃用,您应该使用 implementation。)

我不确定您的目标是什么,但我强烈建议您只使用 Gradle 包装脚本,这意味着您可以根据需要卸载 Gradle 的系统安装。您可以忽略系统上的 Groovy 版本(如果您不在其他地方使用它,也可以将其卸载)。