8

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

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

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

+0

Ссылка [ссылка] (http s: //github.com/evant/gradle-retrolambda). Это может помочь вам. – Sabari

ответ

7

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

Я смог пройти мимо ошибки MethodType not found, добавив мой баннер времени JAVA HOME в bootclasspath графа в файле 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 не установило путь к классу для компилятора Jack, и библиотеки еще не использовали компилятор Jack.

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

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

+0

Возможно ли это сейчас? –

+0

Проблема, которую я открыл с помощью Google, все еще находится в состоянии «Назначено». То есть, другими словами, нет. Этот вопрос был задан только по этой теме. Не помешало бы вам добавить к теме, что это важная проблема для вас тоже. –

0

Я решил проблему, включив 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