airbnb / epoxy

Epoxy is an Android library for building complex screens in a RecyclerView
https://goo.gl/eIK82p
Apache License 2.0
8.46k stars 730 forks source link

Epoxy 5.1.1 java.lang.NoSuchMethodError #1326

Closed nuhkoca closed 1 year ago

nuhkoca commented 1 year ago

Hello,

When I try to update Epoxy to 5.1.1 I am getting the exception below. I use kapt not ksp, do I have to switch to ksp? But 5.0.0 works with no problem. What's exactly changed between 5.0.0 and 5.1.1?

I think this one causes in 5.1.0

Updates Kotlin to 1.7.20 and KSP to 1.7.20-1.0.7, as well as the room compiler processing (xprocessing) library to 2.5.0-beta01.

error: java.lang.NoSuchMethodError: 'androidx.room.compiler.codegen.XTypeName androidx.room.compiler.codegen.XTypeName$Companion.invoke(com.squareup.javapoet.TypeName, com.squareup.kotlinpoet.TypeName, androidx.room.compiler.processing.XNullability)'
    at androidx.room.compiler.processing.javac.JavacType$xTypeName$2.invoke(JavacType.kt:79)
    at androidx.room.compiler.processing.javac.JavacType$xTypeName$2.invoke(JavacType.kt:78)
    at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    at androidx.room.compiler.processing.javac.JavacType.getXTypeName(JavacType.kt:78)
    at androidx.room.compiler.processing.javac.JavacType.access$getXTypeName(JavacType.kt:33)
    at androidx.room.compiler.processing.javac.JavacType$typeName$2.invoke(JavacType.kt:75)
    at androidx.room.compiler.processing.javac.JavacType$typeName$2.invoke(JavacType.kt:74)
    at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    at androidx.room.compiler.processing.javac.JavacType.getTypeName(JavacType.kt:74)
    at com.airbnb.epoxy.processor.Memoizer.typeNameWithWorkaround(Memoizer.kt:403)
    at com.airbnb.epoxy.processor.TypeNameWorkaroundKt.typeNameWithWorkaround(TypeNameWorkaround.kt:29)
    at com.airbnb.epoxy.processor.BasicGeneratedModelInfo.<init>(BasicGeneratedModelInfo.kt:20)
    at com.airbnb.epoxy.processor.EpoxyProcessor.getOrCreateTargetClass(EpoxyProcessor.kt:189)
    at com.airbnb.epoxy.processor.EpoxyProcessor.processRound(EpoxyProcessor.kt:62)
    at com.airbnb.epoxy.processor.BaseProcessor.processRoundInternal(BaseProcessor.kt:225)
    at com.airbnb.epoxy.processor.BaseProcessor.process(BaseProcessor.kt:184)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt:90)
    at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:197)
    at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:985)
    at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:901)
    at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1227)
    at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1340)
    at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1254)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing(annotationProcessing.kt:90)
    at org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing$default(annotationProcessing.kt:31)
    at org.jetbrains.kotlin.kapt3.base.Kapt.kapt(Kapt.kt:47)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.jetbrains.kotlin.gradle.internal.KaptExecution.run(KaptWithoutKotlincTask.kt:316)
    at org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction.execute(KaptWithoutKotlincTask.kt:262)
    at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
    at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
    at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
    at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
    at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
    at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
    at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
    at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
    at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
    at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$2(DefaultWorkerExecutor.java:205)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:187)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:120)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:162)
    at org.gradle.internal.Factories$1.create(Factories.java:31)
    at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:249)
    at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:109)
    at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:114)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:157)
    at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:126)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
elihart commented 1 year ago

The problem is that the processor uses the room compiler library (https://maven.google.com/web/index.html?q=room#androidx.room:room-compiler-processing) and that unfortunately occasionally has breaking changes between version, which means all annotation processors you use need to be on the same version.

With Epoxy 5.1.1 we are using version 2.5.0-beta01 (https://github.com/airbnb/epoxy/blob/master/blessedDeps.gradle#L58). Are you using room, or other annotation processors? Make sure they are using the same version - if you are just using Room then use room version 2.5.0-beta01 and it should work

nuhkoca commented 1 year ago

We don't use Room, only Dagger and not sure if it causes

elihart commented 1 year ago

Dagger uses the same compiler processing library from Room. The latest dagger release should work. related - https://github.com/google/dagger/issues/3633

nuhkoca commented 1 year ago

@elihart Yes upgrading Dagger to the latest version works but this time generated code breaks. Please note I still use KAPT. 5.1.0 works fine but 5.1.1 fails with below

/path/to/file/X.kt: (21, 17): Unresolved reference: id)

Do you know why?

elihart commented 1 year ago

No, I can't tell anything from that snippet