2015-03-28 16 views
43

Tôi đang cố gắng sử dụng retrolambda cùng với plugin gradle-retrolambda. Nói chung nó hoạt động tốt, nhưng khi tôi biên dịch phát hành, giai đoạn lint không thành công với ngoại lệ:Retrolambda: Lint gặp sự cố khi sử dụng biểu thức lambda với retrolambda

:playground.dagger:lintVitalReleaseFailed converting ECJ parse tree to Lombok for file D:\....\playground\dagger\MainActivity.java 
java.lang.UnsupportedOperationException: Unknown ASTNode child: LambdaExpression 
    at lombok.ast.ecj.EcjTreeVisitor.visitOther(EcjTreeVisitor.java:368) 
    at lombok.ast.ecj.EcjTreeVisitor.visitEcjNode(EcjTreeVisitor.java:364) 
    at lombok.ast.ecj.EcjTreeConverter.visit(EcjTreeConverter.java:295) 
    at lombok.ast.ecj.EcjTreeConverter.toTree(EcjTreeConverter.java:236) 
    at lombok.ast.ecj.EcjTreeConverter.fillList(EcjTreeConverter.java:282) 
    at lombok.ast.ecj.EcjTreeConverter.fillList(EcjTreeConverter.java:252) 
    at lombok.ast.ecj.EcjTreeConverter.access$100(EcjTreeConverter.java:141) 
    at lombok.ast.ecj.EcjTreeConverter$2.visitMessageSend(EcjTreeConverter.java:1042) 
    at lombok.ast.ecj.EcjTreeVisitor.visitEcjNode(EcjTreeVisitor.java:156) 
    at lombok.ast.ecj.EcjTreeConverter.visit(EcjTreeConverter.java:295) 
    at lombok.ast.ecj.EcjTreeConverter.toTree(EcjTreeConverter.java:236) 
    at lombok.ast.ecj.EcjTreeConverter.fillList(EcjTreeConverter.java:282) 
    at lombok.ast.ecj.EcjTreeConverter.fillList(EcjTreeConverter.java:252) 
    at lombok.ast.ecj.EcjTreeConverter.toBlock(EcjTreeConverter.java:397) 
    at lombok.ast.ecj.EcjTreeConverter.access$1500(EcjTreeConverter.java:141) 
    at lombok.ast.ecj.EcjTreeConverter$2.visitMethodDeclaration(EcjTreeConverter.java:1241) 
    at lombok.ast.ecj.EcjTreeVisitor.visitEcjNode(EcjTreeVisitor.java:152) 
    at lombok.ast.ecj.EcjTreeConverter.visit(EcjTreeConverter.java:295) 
    at lombok.ast.ecj.EcjTreeConverter.toTree(EcjTreeConverter.java:236) 
    at lombok.ast.ecj.EcjTreeConverter.fillList(EcjTreeConverter.java:282) 
    at lombok.ast.ecj.EcjTreeConverter.fillList(EcjTreeConverter.java:252) 
    at lombok.ast.ecj.EcjTreeConverter.access$100(EcjTreeConverter.java:141) 
    at lombok.ast.ecj.EcjTreeConverter$2.createNormalTypeBody(EcjTreeConverter.java:563) 
    at lombok.ast.ecj.EcjTreeConverter$2.visitTypeDeclaration(EcjTreeConverter.java:486) 
    at lombok.ast.ecj.EcjTreeVisitor.visitEcjNode(EcjTreeVisitor.java:48) 
    at lombok.ast.ecj.EcjTreeConverter.visit(EcjTreeConverter.java:295) 
    at lombok.ast.ecj.EcjTreeConverter.toTree(EcjTreeConverter.java:236) 
    at lombok.ast.ecj.EcjTreeConverter.fillList(EcjTreeConverter.java:282) 
    at lombok.ast.ecj.EcjTreeConverter.fillList(EcjTreeConverter.java:252) 
    at lombok.ast.ecj.EcjTreeConverter.access$100(EcjTreeConverter.java:141) 
    at lombok.ast.ecj.EcjTreeConverter$2.visitCompilationUnitDeclaration(EcjTreeConverter.java:441) 
    at lombok.ast.ecj.EcjTreeVisitor.visitEcjNode(EcjTreeVisitor.java:264) 
    at lombok.ast.ecj.EcjTreeConverter.visit(EcjTreeConverter.java:295) 
    at com.android.tools.lint.EcjParser.parseJava(EcjParser.java:407) 
    at com.android.tools.lint.client.api.JavaVisitor.visitFile(JavaVisitor.java:236) 
    at com.android.tools.lint.client.api.LintDriver.checkJava(LintDriver.java:1491) 
    at com.android.tools.lint.client.api.LintDriver.runFileDetectors(LintDriver.java:1026) 
    at com.android.tools.lint.client.api.LintDriver.checkProject(LintDriver.java:882) 
    at com.android.tools.lint.client.api.LintDriver.analyze(LintDriver.java:433) 
    at com.android.tools.lint.client.api.LintDriver.analyze(LintDriver.java:374) 
    at com.android.tools.lint.LintCliClient.run(LintCliClient.java:130) 
    at com.android.build.gradle.internal.LintGradleClient.run(LintGradleClient.java:112) 
    at com.android.build.gradle.internal.LintGradleClient$run.call(Unknown Source) 
    at com.android.build.gradle.tasks.Lint.runLint(Lint.groovy:198) 
    at com.android.build.gradle.tasks.Lint.this$4$runLint(Lint.groovy) 
    at com.android.build.gradle.tasks.Lint$this$4$runLint$1.callCurrent(Unknown Source) 
    at com.android.build.gradle.tasks.Lint.lintSingleVariant(Lint.groovy:173) 
    at com.android.build.gradle.tasks.Lint$lintSingleVariant$0.callCurrent(Unknown Source) 
    at com.android.build.gradle.tasks.Lint.lint(Lint.groovy:75) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63) 
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218) 
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211) 
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200) 
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579) 
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562) 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) 
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) 
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) 
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) 
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) 
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) 
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) 
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:305) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) 
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23) 
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88) 
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) 
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68) 
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55) 
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149) 
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106) 
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86) 
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80) 
    at org.gradle.tooling.internal.provider.BuildModelAction.run(BuildModelAction.java:43) 
    at org.gradle.tooling.internal.provider.BuildModelAction.run(BuildModelAction.java:30) 
    at org.gradle.tooling.internal.provider.ConfiguringBuildAction.run(ConfiguringBuildAction.java:119) 
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36) 
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26) 
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:47) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:35) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:24) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
    at org.gradle.launcher.daemon.server.exec.StartStopIfBuildAndStop.execute(StartStopIfBuildAndStop.java:33) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:71) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:69) 
    at org.gradle.util.Swapper.swap(Swapper.java:38) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:69) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:70) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
    at org.gradle.launcher.daemon.server.exec.DaemonHygieneAction.execute(DaemonHygieneAction.java:39) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:46) 
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246) 
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Có bất cứ điều gì để làm gì về nó? Tất nhiên, một công việc tầm thường/xung quanh sẽ là vô hiệu hóa lint kiểm tra để phát hành. Nhưng tôi đang tìm giải pháp, cho phép giữ lint.

Sau đây là mô-đun ứng dụng của build.gradle:

apply plugin: 'com.android.application' 
apply plugin: 'me.tatarka.retrolambda' 
apply plugin: 'com.neenbedankt.android-apt' 

configurations { 
    apt 
} 

android { 
    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 

    compileSdkVersion 22 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 

    buildTypes { 
     release { 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

repositories { 
    maven{ 
     url 'https://oss.sonatype.org/content/repositories/snapshots/' 
    } 
} 


dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.0.0' 
    compile 'com.jakewharton:butterknife:6.1.0' 
    compile 'com.google.dagger:dagger:2.0-SNAPSHOT' 
    compile 'de.greenrobot:eventbus:2.4.0' 
    retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:1.8.1' 
    apt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT' 
    provided 'org.glassfish:javax.annotation:10.0-b28' 
} 

gốc build.gradle:

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.1.0' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 
     classpath 'me.tatarka:gradle-retrolambda:2.5.0' 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 
+0

Tôi có cùng một vấn đề từ một thời gian và tiếc là không thể tìm thấy giải pháp nào được nêu ra .. Có thể do 'lint' sử dụng một ngã ba' lombok-ast' không thể xử lý lambdas. Xem: https://android.googlesource.com/platform/prebuilts/tools/+/master/common/lombok-ast/PREBUILT –

+0

Bạn đã nói 'từ một thời gian': ý bạn là bạn có thể sử dụng lambdas trong quá khứ, mà không có lint phàn nàn về nó? –

+0

Không chắc chắn, tôi chỉ nhớ rằng tôi đã sử dụng lambdas cho có thể một hoặc hai tháng trước khi tôi lần đầu tiên nhận thấy vấn đề. Nhưng tôi chủ yếu sử dụng Android Studio để xây dựng. Vấn đề sau đó trở thành có thể nhìn thấy sau khi một gradle xây dựng từ dòng lệnh. –

Trả lời

47

Bạn có thể sử dụng special lombok version với lint không rên rỉ về các tính năng Java 8.

buildscript { 
    repositories { 
     jcenter() 
     ... 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:<version>' 
     classpath 'me.tatarka:gradle-retrolambda:<version>' 
     classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2' 
    } 

    // Exclude the version that the android plugin depends on. 
    configurations.classpath.exclude group: 'com.android.tools.external.lombok' 
} 

Bằng cách này bạn có thể tiếp tục chạy lint trên toàn bộ dự án, ngay cả với phiên bản mới nhất của plugin Android Gradle.

Lưu ý: Nếu bạn gặp lỗi tương tự, hãy thử đặt cấu hình ở trên vào tệp build.gradle trên cùng. Nó sẽ làm việc sau đó.

19

Có một vấn đề GitHub thảo luận về vấn đề này: https://github.com/evant/gradle-retrolambda/issues/96

Một trong những ý kiến ​​trong vấn đề này đề cập đến rằng lint không bao giờ thực sự làm việc với retrolambda mà là, với est lint phiên bản, hiện tại là "không ồn ào" thay vì chỉ đơn giản bỏ qua phần còn lại của tệp khi gặp phải một lambda.

Với ý nghĩ này, có vẻ như có hai tùy chọn. Một, bạn có thể chỉ cần tắt lint như bạn đã đề cập trong câu hỏi của mình. Tất nhiên vấn đề với điều này là bạn sẽ mất lợi ích của việc lint quét phần còn lại của mã của bạn. Tùy chọn thứ hai là khôi phục phiên bản lint của bạn sao cho nó không còn "thất bại" mà chỉ đơn giản là bỏ qua kiểm tra nguồn liên quan đến lambda; theo cách này, lint vẫn có thể quét phần còn lại của mã nguồn ứng dụng của bạn.

Theo vấn đề GitHub, quay lại phiên bản lint từ 24.0.1 (bạn có thể có phiên bản khác) thành 24.0.0 dường như khắc phục được sự cố. Bạn có thể tìm thấy thông tin này trong vấn đề (liên kết được đăng ở đầu câu trả lời).

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