CompileOptions.bootClasspath 属性 已被弃用

The CompileOptions.bootClasspath property has been deprecated

升级到Gradle4.x后,我get the warning

The CompileOptions.bootClasspath property has been deprecated and is scheduled to be removed in Gradle 5.0. Please use the CompileOptions.bootstrapClasspath property instead.

在我的一个项目中。我在 build.gradle 中没有看到任何名为 bootClasspath 或类似的东西。这个警告是什么意思?

警告仅出现在 commons 子项目中,而不出现在 core.

commons/build.gradle:

apply plugin: 'com.android.library'

ext {
    PUBLISH_GROUP_ID = 'com.afollestad.material-dialogs'
    PUBLISH_ARTIFACT_ID = 'commons'
    PUBLISH_VERSION = '0.9.2.3'
    BUILD_TOOLS = "26.0.3"
    TARGET_SDK = 25
}

android {
    compileSdkVersion TARGET_SDK
    buildToolsVersion BUILD_TOOLS

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion TARGET_SDK
        versionCode 1
        versionName PUBLISH_VERSION
    }
    lintOptions {
        checkReleaseBuilds false
    }
}

dependencies {
    implementation project(':core')
}

// Changes to this block must be applied in core/build.gradle and commons/build.gradle
task("javadoc", type: Javadoc) {
    description "Generates Javadoc API documentation for the main source code."
    source = android.sourceSets.main.java.srcDirs
    ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
    classpath += files(ext.androidJar)
    exclude "**/BuildConfig.java"
    exclude "**/R.java"
    options.links("http://docs.oracle.com/javase/7/docs/api/");
    options.links("http://d.android.com/reference/");
}

core/build.gradle:

apply plugin: 'com.android.library'

ext {
    PUBLISH_GROUP_ID = 'com.afollestad.material-dialogs'
    PUBLISH_ARTIFACT_ID = 'core'
    PUBLISH_VERSION = '0.9.2.3'
    SUPPORT_LIBRARY_VERSION = '25.4.0'
    BUILD_TOOLS = "26.0.3"
    TARGET_SDK = 25
}

android {
    compileSdkVersion TARGET_SDK
    buildToolsVersion BUILD_TOOLS

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion TARGET_SDK
        versionCode 1
        versionName PUBLISH_VERSION
        consumerProguardFiles 'progress-proguard.txt'
    }
    lintOptions {
        checkReleaseBuilds false
    }
}

dependencies {
    api "com.android.support:support-v13:$SUPPORT_LIBRARY_VERSION"
    api "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
    api "com.android.support:recyclerview-v7:$SUPPORT_LIBRARY_VERSION"
    api "com.android.support:support-annotations:$SUPPORT_LIBRARY_VERSION"
    implementation "me.zhanghai.android.materialprogressbar:library:1.4.1"
}

// Changes to this block must be applied in core/build.gradle and commons/build.gradle
task("javadoc", type: Javadoc) {
    description "Generates Javadoc API documentation for the main source code."
    source = android.sourceSets.main.java.srcDirs
    ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
    classpath += files(ext.androidJar)
    exclude "**/BuildConfig.java"
    exclude "**/R.java"
    options.links("http://docs.oracle.com/javase/7/docs/api/");
    options.links("http://d.android.com/reference/");
}

我认为这条关于 java 类路径和旧 JDK 的消息,将其添加到您的 gradle 将解决它:

android {

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

建议使用 java 9 JDK 并卸载旧版本,然后将其包含到您的项目结构中:File -> Other settings -> Default project structure.

可能的结论:

android-studio 的默认 JDK 是 ...\Android studio\jre(嵌入式 JDK),如上图所示。此嵌入式 JDK 包含已弃用的 bootClasspath.

使用包含 bootstrapClasspath 的新 JDK 或修改您的 compileOptions 将解决它。

为什么旧的JDK(嵌入式)与新的gradle版本不兼容?

我不知道。

我的 Gradle 在 Ubuntu 上使用来自 /usr/lib/jvm/java-8-openjdk-amd64/jre 的 OpenJDK 8(通过在 build.gradle 中添加 println System.getProperty("java.home") 查看)。否 Android Studio涉及。

我可以通过将 sourceCompatibilitytargetCompatibility 显式设置为 1.7(默认值)来触发警告。通过将 Java 版本更改为

android {

    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

警告消失。

之所以只显示一个项目的警告是因为它没有重复。由于 alphanumerical orderingcommonscore 之前配置。当我将 sourceCompatibilitytargetCompatibility 设置为 1.8 for commons 时,警告移动到 core.

将所有项目的 sourceCompatibilitytargetCompatibility 设置为 1.8 可完全删除警告。如果这就是你想要的项目以及为什么 Gradle 4 不能与 1.7 一起使用而没有警告是两个不同的问题。

除此之外,我可以 offer-up 在 Java 构建中出现错误的地方。引用的:CompileOptions.bootClasspath 必须指向与预期目标系统匹配的 Java run-time JAR。这意味着,例如,如果您在使用 Java 6 的服务器上将程序编译为 运行,则需要将 bootClasspath 设置为指向 compatible Java6 运行次,即:rt.jar

我一般set-up一个项目变量/环境变量指向这个文件:

  • BOOT_CLASSPATH

它通常与 JRE 一起存在,不在 JDK 中,除了在 jre 文件夹下。

在项目Gradle脚本中,我们有:

[compileJava, compileTestJava, ]*.options*.bootClasspath = BOOT_CLASSPATH

明确设置。然而,在其他一些脚本中,我们根本没有公开设置 bootClasspath,并且仍然有相关消息。

The CompileOptions.bootClasspath property has been deprecated
and is scheduled to be removed in Gradle 5.0. Please use the    
CompileOptions.bootstrapClasspath property instead.

...无论如何。因此,我推测 Java 插件正在将其作为一些默认行为。我意识到那只是背景故事。我可以协助解决警告。

CompileOptions.bootstrapClasspath`