CompileOptions.bootClasspath属性已被弃用。

21

升级到Gradle 4.x后,我在我的一个项目中收到了警告

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

在我的一个项目中看到了这个警告,但我的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/");
}

核心代码/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/");
}
3个回答

17

我的 Gradle 在 Ubuntu 上使用 OpenJDK 8,路径为 /usr/lib/jvm/java-8-openjdk-amd64/jre(在 build.gradle 中添加 println System.getProperty("java.home") 可以查看)。没有使用 Android Studio。

如果将 sourceCompatibilitytargetCompatibility 显式设置为 1.7(默认值),就会触发警告。可以通过更改 Java 版本来解决。

android {

    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

警告消失的原因在于只有一个项目出现了该问题。由于字母数字排序commonscore之前被配置。当我将sourceCompatibilitytargetCompatibility设置为1.8时,警告出现在core中。

将所有项目的sourceCompatibilitytargetCompatibility设置为1.8可以完全消除警告。如果这是您的项目所需要的,并且为什么Gradle 4无法与1.7兼容的问题是两个不同的问题。


1
找不到方法compileOptions()。 - Ashish Dwivedi

16

我认为这个关于Java Classpath和旧版JDK的消息,将其添加到你的Gradle中就可以解决了:

android {

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

建议使用Java 9 JDK,并卸载旧版本,然后将其包含到您的项目结构中:文件 -> 其他设置 -> 默认项目结构

enter image description here

可能的结论:

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

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

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

我也不知道。


谢谢你指引我正确的方向。根据你的建议,我写了一个更详细的答案,其中不包括任何JDK 9的解决方案,因为在我的环境中不适用。 - Simon Warta

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插件正在执行某些默认行为。我意识到这只是背景故事。我可以帮助解决警告。

CompileOptions.bootstrapClasspath`


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接