为什么 gradle 失败并出现包 javax.xml.bind.annotation 不存在错误?

Ahm*_*wad 3 java gradle

我有一个相当复杂的 gradle 设置(一个父项目和许多子项目)。子项目之一失败并出现以下错误:

package javax.xml.bind.annotation does not exist

我正在使用包含此包的 Oracle Java 8(它已在 Java 11 中删除)。我确实安装了 Java 11,但它不是我的活动 Java 版本。这是唯一因这些错误而失败的子项目,而我确实有其他子项目引用相同的包并成功构建。

理论上来说,Java版本是不会混淆的。

$ echo $JAVA_HOME
/usr/lib/jvm/java-8-u221-oracle
Run Code Online (Sandbox Code Playgroud)
$ java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
Run Code Online (Sandbox Code Playgroud)

使用 gradle 包装器:

$ ./gradlew -v

------------------------------------------------------------
Gradle 5.6.4
------------------------------------------------------------

Build time:   2019-11-01 20:42:00 UTC
Revision:     dd870424f9bd8e195d614dc14bb140f43c22da98

Kotlin:       1.3.41
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.14 compiled on March 12 2019
JVM:          1.8.0_221 (Oracle Corporation 25.221-b11)
OS:           Linux 5.0.0-36-generic amd64
Run Code Online (Sandbox Code Playgroud)

即使我println(org.gradle.internal.jvm.Jvm.current())它打印 Java 8。

Ahm*_*wad 7

我想到了!问题是这javac -version是错误的,它指向 Java 11 而不是 8,尽管事实上 myjava -versionehco $JAVA_HOME都指向 Java 8。

我使用该--info选项运行了 gradle 任务,并仔细阅读了输出。我发现在接近尾声的时候,它说:

Compiling with Java command line compiler 'javac'.
Starting process 'command 'javac''. Working directory: /path/to/project Command: javac @/path/to/project/build/tmp/compileJava/java-compiler-args.txt
Successfully started process 'command 'javac''
:project:compileJava (Thread[Execution worker for ':',5,main]) completed. Took 2.035 secs.
2 actionable tasks: 2 executed
Run Code Online (Sandbox Code Playgroud)

于是我就想到去检查一下javac -version,果然,我发现了javac 11.0.4。原因是我上次将Java 从 8 更改为 11 时也update-alternatives --config java忘记了。update-alternatives --config javac