Search code examples
javaandroidgradleandroid-gradle-pluginbuild.gradle

Android app throws NoClassDefFoundError after setting Gradle SourceSets


I am trying to understand how to set sourcesets in build.gradle.kts file. For that i have a test project. The project structure is as follows-
app
-src
--main
---java
----com.example.myapplication
-----MainActivity.kt
--sample2
---java
----com.example.myapp.legacy
-----LegacyFile.java

LegacyFile.java

package com.example.myapp.legacy;

public class LegacyFile {

}

Here, i wan to create instance of LegacyFile inside MainActivity.kt file -

    override fun onCreate(savedInstanceState: Bundle?) {
....
        val legacyFile = LegacyFile()
} 

So, i added the following lines to app/build.gradle.kts file -

android {
.....
    sourceSets.getByName("main").apply {
        kotlin.setSrcDirs(listOf("src/sample2/java"))
    } 
}

Now, the project compiles successfully. But, when i run the app it throws an exception -

FATAL EXCEPTION: main Process: com.example.myapplication, PID: 2436 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/example/myapp/legacy/LegacyFile; at com.example.myapplication.MainActivity.onCreate(MainActivity.kt:25) ..... Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.myapp.legacy.LegacyFile" on path: DexPathList[[dex file "/data/data/com.example.myapplication/code_cache/.overlay/base.apk/classes5.dex", zip file "/data/app/~~5E7UPyWAZdlsGbzLHVOIJw==/com.example.myapplication-kmtHz5UXr_gzaXYqPtpKyA==/base.apk"],nativeLibraryDirectories=[/data/app/~~5E7UPyWAZdlsGbzLHVOIJw==/com.example.myapplication-kmtHz5UXr_gzaXYqPtpKyA==/lib/x86_64, /system/lib64, /system_ext/lib64]]

When i inspect the apk file, i can see LegacyFile - Android Studio apk viewer

Can someone please explain what i am doing wrong here?

Thanks!


Solution

  • Update to this:

    android {
    .....
        sourceSets.getByName("main") {
            java.srcDir("src/sample2/java")
        } 
    }
    

    or

    android {
    .....
        sourceSets.getByName("main") {
            java.srcDirs += ['src/sample2/java']
        } 
    }
    

    FYI: kotlin.srcDirs didn't work because you are trying to source .java files instead of .kt files.