Gradle、Javadoc 和 JDK 版本
Gradle, Javadoc and JDK version
我安装了多个 JDK。
在我的 build.gradle 中,我设置了 sourceCompatibility = 1.8
以确保使用正确的。这很好用。
然而,这似乎被 Javadoc 任务 (./gradlew javadoc
) 忽略了,它失败并出现错误 (error: package sun.net.www.protocol.http is not visible
) -- 来自 I了解到这是 Java 9.
中的一项新功能的问题
截至目前,该项目仅针对 Java 8。有一天它会升级到 Java 9,但不是今天,所以我只想使用 Java 8 javadoc 生成器而不是 Java 9 版本。
我检查了 task documentation,但似乎没有任何选项可以指定 JDK 版本。我能做什么?
我希望解决方案是 Gradle 配置,因此可以轻松地与不同机器上的其他开发人员共享。
Gradle 出现该行为的版本(通过 IntelliJ 安装):
------------------------------------------------------------
Gradle 4.4
------------------------------------------------------------
Build time: 2017-12-06 09:05:06 UTC
Revision: cf7821a6f79f8e2a598df21780e3ff7ce8db2b82
Groovy: 2.4.12
Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM: 10.0.1 (Oracle Corporation 10.0.1+10-Debian-4)
OS: Linux 4.16.0-2-amd64 amd64
Gradle Javadoc 任务(通过 Debian 的存储库安装)出现警告而不是失败的版本:
------------------------------------------------------------
Gradle 3.4.1
------------------------------------------------------------
Build time: 2012-12-21 00:00:00 UTC
Revision: none
Groovy: 2.4.15
Ant: Apache Ant(TM) version 1.10.3 compiled on June 13 2018
JVM: 10.0.1 (Oracle Corporation 10.0.1+10-Debian-4)
OS: Linux 4.16.0-2-amd64 amd64
编辑——我发现 this page 指定了一个“-source release”参数,这可能是解决这个问题的方法,但是我找不到它应该被称为:
javadoc {
options.addStringOption('-source', '8')
}
此编译和运行没有警告(在 build.gradle
中),但不会更改任何内容并且不会出现在 /build/tmp/javadoc/javadoc.options
.
中
我通过以下操作更改了路径中可用的版本:
export JAVA_HOME=/usr/lib/jvm/default-java
javadoc {
options.source = "8"
}
可能需要将其添加到现有的 javadoc
、javadoc.options
或 options
块中。
它应该是一个字符串,而不是一个整数。不知道为什么 java 插件不自动设置这个。
从 Gradle 6.7 开始,您可以使用 Gradle Toolchains for JVM Projects.
更改用于不同任务的 Java 版本
因此您可以在 build.gradle 文件中定义工具链,将其指向您要使用的 Java 版本。这可以是本地 JDK 或者如果 Gradle 没有检测到指定的本地 JDK,它将下载一个。您可以通过 运行:
查看工具链 Gradle 在您的系统上检测到的内容
gradle -q javaToolchains
如果你指向 Java 8:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
}
}
然后将任务指向它。对于 Javadoc 任务,它将是:
tasks.withType(Javadoc) {
javadocTool.set(javaToolchains.javadocToolFor(java.toolchain))
}
JavaExec 和 JavaCompile 任务也是如此。 setter 只是有点不同:
tasks.withType(JavaExec) {
javaLauncher.set(javaToolchains.launcherFor(java.toolchain))
}
tasks.withType(JavaCompile) {
javaCompiler.set(javaToolchains.compilerFor(java.toolchain))
}
这将允许您在主项目甚至子项目中使用不同的 JDK 来完成不同的任务(这就是我使用它的方式)
旁注,可能需要 'java-library' and/or 'application' 插件才能访问 build.gradle 文件中的 java 对象。我不完全确定,因为它们已经存在于我正在使用的项目中,有人可以评论和澄清。
plugins {
id 'application'
id 'java-library'
}
我安装了多个 JDK。
在我的 build.gradle 中,我设置了 sourceCompatibility = 1.8
以确保使用正确的。这很好用。
然而,这似乎被 Javadoc 任务 (./gradlew javadoc
) 忽略了,它失败并出现错误 (error: package sun.net.www.protocol.http is not visible
) -- 来自
截至目前,该项目仅针对 Java 8。有一天它会升级到 Java 9,但不是今天,所以我只想使用 Java 8 javadoc 生成器而不是 Java 9 版本。
我检查了 task documentation,但似乎没有任何选项可以指定 JDK 版本。我能做什么?
我希望解决方案是 Gradle 配置,因此可以轻松地与不同机器上的其他开发人员共享。
Gradle 出现该行为的版本(通过 IntelliJ 安装):
------------------------------------------------------------
Gradle 4.4
------------------------------------------------------------
Build time: 2017-12-06 09:05:06 UTC
Revision: cf7821a6f79f8e2a598df21780e3ff7ce8db2b82
Groovy: 2.4.12
Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM: 10.0.1 (Oracle Corporation 10.0.1+10-Debian-4)
OS: Linux 4.16.0-2-amd64 amd64
Gradle Javadoc 任务(通过 Debian 的存储库安装)出现警告而不是失败的版本:
------------------------------------------------------------
Gradle 3.4.1
------------------------------------------------------------
Build time: 2012-12-21 00:00:00 UTC
Revision: none
Groovy: 2.4.15
Ant: Apache Ant(TM) version 1.10.3 compiled on June 13 2018
JVM: 10.0.1 (Oracle Corporation 10.0.1+10-Debian-4)
OS: Linux 4.16.0-2-amd64 amd64
编辑——我发现 this page 指定了一个“-source release”参数,这可能是解决这个问题的方法,但是我找不到它应该被称为:
javadoc {
options.addStringOption('-source', '8')
}
此编译和运行没有警告(在 build.gradle
中),但不会更改任何内容并且不会出现在 /build/tmp/javadoc/javadoc.options
.
我通过以下操作更改了路径中可用的版本:
export JAVA_HOME=/usr/lib/jvm/default-java
javadoc {
options.source = "8"
}
可能需要将其添加到现有的 javadoc
、javadoc.options
或 options
块中。
它应该是一个字符串,而不是一个整数。不知道为什么 java 插件不自动设置这个。
从 Gradle 6.7 开始,您可以使用 Gradle Toolchains for JVM Projects.
更改用于不同任务的 Java 版本因此您可以在 build.gradle 文件中定义工具链,将其指向您要使用的 Java 版本。这可以是本地 JDK 或者如果 Gradle 没有检测到指定的本地 JDK,它将下载一个。您可以通过 运行:
查看工具链 Gradle 在您的系统上检测到的内容gradle -q javaToolchains
如果你指向 Java 8:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
}
}
然后将任务指向它。对于 Javadoc 任务,它将是:
tasks.withType(Javadoc) {
javadocTool.set(javaToolchains.javadocToolFor(java.toolchain))
}
JavaExec 和 JavaCompile 任务也是如此。 setter 只是有点不同:
tasks.withType(JavaExec) {
javaLauncher.set(javaToolchains.launcherFor(java.toolchain))
}
tasks.withType(JavaCompile) {
javaCompiler.set(javaToolchains.compilerFor(java.toolchain))
}
这将允许您在主项目甚至子项目中使用不同的 JDK 来完成不同的任务(这就是我使用它的方式)
旁注,可能需要 'java-library' and/or 'application' 插件才能访问 build.gradle 文件中的 java 对象。我不完全确定,因为它们已经存在于我正在使用的项目中,有人可以评论和澄清。
plugins {
id 'application'
id 'java-library'
}