8

Khi tôi sử dụng biểu thức lambda trong Mô-đun thư viện Android, tôi nhận được ngoại lệ trình biên dịch com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.invoke.MethodType not found.Lambda gây ra ngoại lệ trình biên dịch trong Mô-đun thư viện Android

Biểu thức Lambda đang biên dịch không có lỗi khi được sử dụng trong mô-đun ứng dụng Android.

Một dự án mẫu để chứng minh vấn đề có thể được tìm thấy ở đây:
https://github.com/adamdye/AndroidLambdaIssue

Các lớp thú vị trong ví dụ này là MyLibrary.java và MainActivity.java. Mỗi lớp chứa các biểu thức giống nhau.

Cài đặt

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 

Tôi không quan tâm đến việc sử dụng retro-lambda. Tôi muốn làm việc này thông qua cấu hình thích hợp. Tôi cho rằng tôi đang bỏ lỡ một bước nào đó.

+0

Liên kết [link] này (http s: //github.com/evant/gradle-retrolambda). Điều này có thể giúp bạn .. – Sabari

Trả lời

7

Chỉ cần khoanh tròn lại và thêm những gì tôi đã học.

Tôi đã vượt qua được lỗi MethodType not found bằng cách thêm jar thời gian chạy của JAVA HOME vào lớp khởi động của gradle trong tệp build.gradle của dự án.

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

Tuy nhiên, ứng dụng sẽ không triển khai cho thiết bị hoặc trình giả lập vì nhiệm vụ không thể thực hiện được app:transformClassesWithPreJackPackagedLibrariesForDebug. Nó đòi hỏi rằng tất cả các giao diện được sử dụng như là một lamba là trên classpath. Bản sửa lỗi bootclasspath không đặt classpath cho trình biên dịch Jack và các thư viện không sử dụng trình biên dịch Jack.

Tôi mở một báo cáo lỗi về vấn đề này: https://code.google.com/p/android/issues/detail?id=211386

Họ nhận xét rằng điều này sẽ được giải quyết trong tương lai gần.

+0

Có thể bây giờ không? –

+0

Vấn đề tôi đã mở với Google vẫn ở trạng thái "Đã giao". Nói cách khác, không. Cùng một câu hỏi đó chỉ được hỏi về chuỗi đó. Nó sẽ không làm tổn thương cho bạn để đi thêm vào các chủ đề mà nó là một vấn đề quan trọng với bạn quá. –

0

Tôi đã giải quyết vấn đề bằng cách bao gồm JAR chứa các nguồn Java làm phụ thuộc, thay vì JAR được biên dịch. Đây là cách tôi cấu hình dự án của tôi:

Trong thư viện của build.gradle:

configurations { 
    sources 
} 

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

artifacts { 
    sources sourcesJar 
} 

Trong ứng dụng của build.gradle:

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

Tất nhiên thư viện được bao gồm như là một dự án bên ngoài trong của ứng dụng settings.gradle

Các vấn đề liên quan