Лямбда вызывает исключение компилятора в модуле библиотеки 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