Лямбда вызывает исключение компилятора в модуле библиотеки Android

Когда я использую лямбда-выражение в модуле библиотеки Android, я получаю исключение компилятора com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.invoke.MethodType not found,

Лямбда-выражения компилируются без ошибок при использовании в модуле приложения Android.

Пример проекта для демонстрации проблемы можно найти здесь:
https://github.com/adamdye/AndroidLambdaIssue

Интересные классы в примере - это MyLibrary.java и MainActivity.java. Каждый класс содержит одинаковые выражения.

Настроить

 Android Studio 2.2 preview 1
 min/target SDK version = android-N
 build tools version = 24.0.0.rc4
jack compiler enabled
source/target compatibility = 1.8
Gradle version = 2.10
Android Plugin Version = 2.2.0-alpha1
JDK = java 8 

Я не заинтересован в использовании ретро-лямбды. Я хотел бы заставить это работать через правильную конфигурацию. Я предполагаю, что я пропускаю шаг где-то.

2 ответа

Решение

Просто чтобы обвести назад и добавить то, что я узнал.

Я смог пройти MethodType not found ошибка при добавлении JAR-файла JAVA HOME в bootclasspath gradle в файле build.gradle проекта.

allprojects {    
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xbootclasspath/a:" + System.properties.get("java.home") + "/lib/rt.jar"
        }
    }
}

Однако приложение не будет развернуто на устройстве или эмуляторе, потому что app:transformClassesWithPreJackPackagedLibrariesForDebug Задача Gradle не удается. Это требует, чтобы все интерфейсы, которые используются в качестве lamba, находились в пути к классам. Исправление bootclasspath не установило classpath для компилятора Jack, а библиотеки еще не используют компилятор Jack.

Я открыл сообщение об ошибке по этой проблеме: https://code.google.com/p/android/issues/detail?id=211386

Они отметили, что это будет решено в ближайшее время.

Я решил проблему, включив JAR, содержащий источники Java, в качестве зависимости, вместо скомпилированного JAR. Вот как я настроил свои проекты:

В библиотекеbuild.gradle:

configurations {
    sources
}

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.java.srcDirs
}

artifacts {
    sources sourcesJar
}

В приложенииbuild.gradle:

dependencies {
    compile project(path: ":gdxstudio-core", configuration: "sources")

Конечно, библиотека включена как внешний проект в приложение settings.gradle

Другие вопросы по тегам