Resource image not found on platforms
I placed my resources under commonMain besides the kotlin directory, inside the libres folder as stated in the README.md.
When trying to run my Compose Multiplatform JVM based desktop app, I get this exception when trying to get the painterResource for my Image composable:
Exception in thread "main" java.lang.IllegalArgumentException: Resource images/flower_image.jpg not found
at androidx.compose.ui.res.ClassLoaderResourceLoader.load(Resources.desktop.kt:122)
at androidx.compose.ui.res.Resources_desktopKt.openResource(Resources.desktop.kt:71)
at androidx.compose.ui.res.PainterResources_desktopKt.rememberBitmapResource(PainterResources.desktop.kt:137)
at androidx.compose.ui.res.PainterResources_desktopKt.painterResource(PainterResources.desktop.kt:70)
at androidx.compose.ui.res.PainterResources_desktopKt.painterResource(PainterResources.desktop.kt:57)
at io.github.skeptick.libres.compose.ActualsKt.painterResource(actuals.kt:9)
at io.github.skeptick.libres.compose.PainterResourceKt.painterResource(PainterResource.kt:11)
Similar issue happens when running on JS based platform:
When requesting the flower_image.jpg, the GET request returns with a 404 (not found) status.
Platforms affected (Android works fine):
- JVM
- JS
Versions:
- Kotlin: 1.9.20
- Libres: 1.2.0
- Compose Multiplatform: 1.5.10
- Android Gradle Plugin: 8.2.0-rc02
I suspect, that resources' path has been changed recently, either with newer Kotlin or Compose Multiplatform versions.
Path to your image looks like commonMain/libres/images/flower_image.jpg?
Yes, it does. Also, string resources are working fine on all platforms.
I will soon make an open-source repository so you may reproduce the problem. @Skeptick
You can clone this branch to reproduce the problem.
This issue isn't related to Libres. Typical JVM-application build doesn't include resources from other modules. You need to explicitly configure dependency or build a fat JAR. Or you can use compose plugin and add this code:
// desktop/build.gradle.kts
compose.desktop {
application {
mainClass = "com.example.demo.MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "desktop"
packageVersion = "1.0.0"
}
}
}
And run via ./gradlew desktop:run
Thanks, will test this out later. I may do a PR about this though to update docs and clarify some things about resource management.