Skeptick / libres

Resources generation in Kotlin Multiplatform
Apache License 2.0
210 stars 12 forks source link

Resource image not found on platforms #39

Open HLCaptain opened 1 year ago

HLCaptain commented 1 year ago

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):

Versions:

I suspect, that resources' path has been changed recently, either with newer Kotlin or Compose Multiplatform versions.

Skeptick commented 1 year ago

Path to your image looks like commonMain/libres/images/flower_image.jpg?

HLCaptain commented 1 year ago

Yes, it does. Also, string resources are working fine on all platforms.

HLCaptain commented 1 year ago

I will soon make an open-source repository so you may reproduce the problem. @Skeptick

HLCaptain commented 1 year ago

You can clone this branch to reproduce the problem.

Skeptick commented 1 year ago

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

HLCaptain commented 1 year ago

Thanks, will test this out later. I may do a PR about this though to update docs and clarify some things about resource management.