8

Kiedy używam wyrażenia lambda w module biblioteki Androida, otrzymuję wyjątek kompilatora com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.invoke.MethodType not found.Lambda powoduje wyjątek od kompilatora w bibliotece Android Moduł

Wyrażenia lambdy kompilują się bezbłędnie, gdy są używane w module aplikacji Android.

przykładowy projekt wykazać problemu można znaleźć tutaj:
https://github.com/adamdye/AndroidLambdaIssue

Ciekawe zajęcia w przykładzie są MyLibrary.java i MainActivity.java. Każda klasa zawiera identyczne wyrażenia.

Konfiguracja

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 

Nie jestem zainteresowany wykorzystaniem retro-lambda. Chciałbym, żeby to działało przez odpowiednią konfigurację. Zakładam, że gdzieś brakuje mi jakiegoś kroku.

+0

Odsyłacz do tego [link] (http s: //github.com/evant/gradle-retrolambda). To może ci pomóc .. – Sabari

Odpowiedz

7

Wystarczy, aby zakreślić i dodać to, czego się nauczyłem.

Udało mi się ominąć błąd MethodType not found, dodając mój plik środowiska wykonawczego JAVA HOME do ścieżki bootclas gradle w pliku build.gradle projektu.

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

Jednak aplikacja nie będzie zainstalować na urządzeniu lub emulatorze ponieważ app:transformClassesWithPreJackPackagedLibrariesForDebug Gradle zadanie nie powiedzie się. Wymaga, aby wszystkie interfejsy używane jako lamba znajdowały się w ścieżce klas. Poprawka bootclasspath nie ustawiła ścieżki klasy dla kompilatora Jack, a biblioteki nie używają jeszcze kompilatora Jack.

Otworzyłem raport błędu w tej kwestii: https://code.google.com/p/android/issues/detail?id=211386

Oni zauważyli, że zostanie to uwzględnione w najbliższej przyszłości.

+0

Czy to możliwe? –

+0

Problem, który otworzyłem w Google, wciąż znajduje się w stanie "Przypisano". Innymi słowy, nie. To samo pytanie właśnie zadano w tym wątku. Nie zaszkodzi ci dodać do wątku, że jest to dla ciebie ważna kwestia. –

0

Rozwiązałem problem, włączając JAR zawierający źródła Javy jako zależność zamiast skompilowanego pliku JAR. W ten sposób skonfigurowałem moje projekty:

W Biblioteki build.gradle:

configurations { 
    sources 
} 

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

artifacts { 
    sources sourcesJar 
} 

W aplikacji build.gradle:

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

Oczywiście biblioteka jest włączone jako projekt zewnętrznego w aplikacji settings.gradle

Powiązane problemy