Gradle, Javadoc and JDK version



我安装了多个JDK。

在我的build.gradle中,我设置了sourceCompatibility = 1.8以确保使用正确的一个。这工作正常。

然而,Javadoc任务(./gradlew javadoc(似乎忽略了这一点,它失败并出现错误(error: package sun.net.www.protocol.http is not visible(——从这个问题中我了解到这是Java 9中新功能的问题。

截至目前,该项目仅针对Java 8。有一天它会升级到Java 9,但不是今天,所以我只想使用Java 8 javadoc生成器而不是Java 9版本。

我检查了任务文档,但看起来没有任何选项可以指定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
编辑 - 我

发现这个页面指定了一个"-sourcerelease"参数,这可能是这个问题的解决方案,但是我找不到它应该被调用的方式:

javadoc {
options.addStringOption('-source', '8')
}

这将编译和运行,没有警告(build.gradle(,但不会更改任何内容,也不会出现在/build/tmp/javadoc/javadoc.options中。

从 Gradle6.7 开始,您可以使用 JVM 项目的 Gradle 工具链更改用于不同任务的 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任务也是如此。二传手只是有点不同:

tasks.withType(JavaExec) {
javaLauncher.set(javaToolchains.launcherFor(java.toolchain))
}
tasks.withType(JavaCompile) {
javaCompiler.set(javaToolchains.compilerFor(java.toolchain))
}

这将允许您在主项目甚至子项目中为不同的任务使用不同的JDK(这就是我使用它的方式(

旁注,可能需要"java-library"和/或"application"插件才能访问build.gradle文件中的java对象。我不完全确定,因为它们已经存在于我正在使用的项目中,有人可以评论和澄清。

plugins {
id 'application'
id 'java-library'
}

我通过以下方式更改了路径中的可用版本:

export JAVA_HOME=/usr/lib/jvm/default-java
javadoc {
options.source = "8"
}

也许需要将其添加为现有的javadocjavadoc.optionsoptions块。

它应该是一个字符串,而不是一个整数。 不知道为什么 java 插件不会自动设置它。

最新更新