21

升级到 Gradle 4.x 后,我收到警告

CompileOptions.bootClasspath 属性已被弃用,并计划在 Gradle 5.0 中删除。请改用 CompileOptions.bootstrapClasspath 属性。

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

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

公共/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/");
}

核心/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/");
}
4

3 回答 3

17

我的 Gradle 使用的是/usr/lib/jvm/java-8-openjdk-amd64/jreUbuntu 上的 OpenJDK 8(请参阅添加println System.getProperty("java.home")build.gradle。不涉及 Android Studio。

sourceCompatibility我可以通过显式设置和targetCompatibility1.7(默认值)来触发警告。通过将 Java 版本更改为

android {

    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

警告消失。

仅针对一个项目显示警告的原因是它不会重复。由于字母数字排序commons,之前已配置。当我将and设置为 1.8 时,警告移至.coresourceCompatibilitytargetCompatibilitycommonscore

sourceCompatibility将所有项目的and设置targetCompatibility为 1.8 会完全删除警告。如果这是您想要的项目,以及为什么 Gradle 4 不能在 1.7 中无警告地使用,这是两个独立的问题。

于 2017-12-04T12:37:43.843 回答
16

我认为这条关于 java Classpath 和旧 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 版本不兼容?

我不知道。

于 2017-12-01T16:59:41.503 回答
0

除了上述之外,我可以提供Java构建出现错误的位置。引用的:CompileOptions.bootClasspath必须指向与预期目标系统匹配的 Java 运行时 JAR。这意味着,例如,如果您正在编译以在使用 Java 6 的服务器上运行程序,则需要将 设置bootClasspath为指向兼容的Java6 运行时,即:rt.jar

我通常设置一个项目变量/环境变量来指向这个文件:

  • 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 插件本身就是作为一些默认行为这样做的。我意识到这只是背景故事。我可以协助解决警告。

编译选项.bootstrapClasspath`

于 2018-03-07T12:43:59.127 回答