不推荐使用CompileOptions.bootClasspath属性

时间:2017-11-26 10:21:56

标签: android gradle build.gradle android-gradle-3.0

升级到Gradle 4.x后,我get the warning

  

不推荐使用CompileOptions.bootClasspath属性,并计划在Gradle 5.0中将其删除。请改用CompileOptions.bootstrapClasspath属性。

在我的一个项目中。我的build.gradle中没有看到任何名为bootClasspath或类似内容的内容。这个警告意味着什么?

警告只会出现在 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 个答案:

答案 0 :(得分:15)

My 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 orderingcommons之前配置了core。当我为sourceCompatibility设置targetCompatibilitycommons为1.8时,警告将移至core

将所有项目的sourceCompatibilitytargetCompatibility设置为1.8会完全删除警告。如果这是你想要的项目,以及为什么Gradle 4不能免费使用1.7是两个单独的问题。

答案 1 :(得分:14)

我认为这条关于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

enter image description here

可能的结论:

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

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

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

我不知道。

答案 2 :(得分: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`