Realm-java: Execution failed for task ':app:transformClassesWithRealmTransformerForDevelopmentDebug'.

Created on 27 Jul 2019  路  13Comments  路  Source: realm/realm-java

Goal

I want to move some of my 'Realm' classes to a 'base' library module. This module will be added to my 'app' module. The project was compiling fine when these classes were in the 'app' module.

Actual Results

As soon as I compile, I get the following error. I have attached the complete stack trace.

* Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithRealmTransformerForDevelopmentDebug'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:95) at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:119) at org.gradle.api.internal.tasks.execution.ResolvePreviousStateExecuter.execute(ResolvePreviousStateExecuter.java:43) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45) at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:94) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:56) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:67) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49) at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315) at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305) at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101) at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) Caused by: java.lang.RuntimeException: cannot find com.cubivue.base.R$layout: com.cubiVue.base.R$layout found in com/cubivue/base/R$layout.class at javassist.CtClassType.getClassFile3(CtClassType.java:208) at javassist.CtClassType.makeFieldCache(CtClassType.java:900) at javassist.CtClassType.getMembers(CtClassType.java:891) at javassist.CtClassType.getDeclaredBehaviors(CtClassType.java:1039) at io.realm.transformer.BytecodeModifier$Companion.useRealmAccessors(ByteCodeModifier.kt:67) at io.realm.transformer.build.FullBuild.transformDirectAccessToModelFields(FullBuild.kt:135) at io.realm.transformer.RealmTransformer.transform(RealmTransformer.kt:109) at com.android.build.api.transform.Transform.transform(Transform.java:302) at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239) at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102) at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73) at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:47) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:284) at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301) at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293) at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175) at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91) at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:273) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:258) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:67) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:145) at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:49) at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34) at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69) at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49) at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:33) at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50) at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:43) at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:29) at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:134) at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$3(CacheStep.java:83) at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:82) at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:36) at org.gradle.internal.execution.impl.steps.PrepareCachingStep.execute(PrepareCachingStep.java:33) at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:38) at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:23) at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96) at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89) at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52) at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36) at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:34) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:91) ... 32 more

Version of Realm and tooling

Realm version(s): 5.12.0

Realm Sync feature enabled: No

Android Studio version: 3.4.2

Android Build Tools version: 28.0.3

Gradle version: 5.1.1-all

O-Community T-Bug-Crash

All 13 comments

Here is my 'base' gradle file:

 apply plugin: 'com.android.library'
 apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 apply plugin: 'kotlin-kapt'
 apply plugin: 'realm-android'

 android {
     compileSdkVersion 28


defaultConfig {
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
compileOptions {
    sourceCompatibility 1.8
    targetCompatibility 1.8
}
kapt {
    arguments {
        arg("realm.ignoreKotlinNullability", true)
    }
}
}

 apply from: '../dependencies.gradle'

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

  //Lifecycle
  implementation lifeCycle.values()

  //Retrofit
  implementation retrofitDependencies.values()

  //Image Loader
  implementation imageDependencies.values()

  //Dependency Injection
  implementation daggerDependencies.values()

  //Rx
  implementation reactiveDependencies.values()

  //Others
  implementation otherComponents.values()

  //Compilers
  kapt compilers.values()

  //Logger
  implementation "com.embrace.plog:plog:1.0.3"
 }

It's the same error everytime:

 * What went wrong:
Execution failed for task ':app:transformClassesWithRealmTransformerForDevelopmentDebug'.

cannot find com.cubivue.base.R$layout: com.cubiVue.base.R$layout found in
com/cubivue/base/R$layout.class

@umair13adil Can you provide a sample project demonstrating the issue. From the information provided it is hard to tell exactly what is wrong.

@cmelchior Thank you for responding. I have prepared a sample project, it produces the same error. I have uploaded zip here. You can simply run ':app' module.

RealmTest_umair13adil.zip

@cmelchior Did you find anything?

When unpacking the zip file and running ./gradlew assemble from the root folder it compiles fine.

The same if I specifically run ./gradlew app:transformClassesWithRealmTransformerForDevelopmentDebug

It might be a faulty cache on your end. Have you tried removing all build folders and cleaning the global Gradle cache? It is usually located in `/.gradle/caches

I tried the above steps, it didn't work for me. I also ran this project on a different machine, had the same error. Can you please try again by 'Rebuilding' project?

Ah sorry. I overlooked the build failure because it was hidden in all the debug output from the commandline 馃う鈥嶁檪. Yes, I can reproduce it. I'll be looking into it.

So, I can reproduce this in your project, but not in a local unit test, even when I copy the R file in question and try to modify it directly.

This could indicate some kind of problem in the byte code generated by Android but when comparing the output from Android with the one from a pure Java project they look identical. So it is a bit puzzling.

Alternatively, there is a bug in how the bytecode transformer is adding files to its internal lists. This is not really unit tested as the transformer logic runs as part of the build and thus cannot be instrumented.

I'll keep digging.

I tried to copy the actual compiled R*.class files from the compiled project to my unit test and loading them using JavaAssist (which is what the transformer does). This seems to work which is really puzzling, but it does point to the problem being in the Transformer and how it knows which files are in the class pool. This could be related to https://github.com/realm/realm-java/issues/6531 although that issue shouldn't be a problem until 3.6.0 :/

Okay. I will then try to run with an older version of Gradle.

Your project was already running with 3.4.2 which is a stable version.

I found the root cause. It is actually also in the error description: cannot find com.cubivue.base.R$id: com.cubiVue.base.R$id found in com/cubivue/base/R$id.class

Note the difference between cubivue and cubiVue. Only lower case letters should be used in package names and even though it isn't strictly required by the JVM spec it is highly discouraged. And in this case, it actually breaks JavaAssist as they have a check comparing two strings that are case sensitive ((although you could argue it is a bug in their implementation).

If you lowercase the package name it should work.

Oh, yes that makes sense, I will fix that. Thanks a lot for your help. 馃憤

Was this page helpful?
0 / 5 - 0 ratings

Related issues

AlbertVilaCalvo picture AlbertVilaCalvo  路  3Comments

AAChartModel picture AAChartModel  路  3Comments

Merlin1993 picture Merlin1993  路  3Comments

tloshi picture tloshi  路  3Comments

jjorian picture jjorian  路  3Comments