Skip to content

Commit df55025

Browse files
committed
feat(sample): migrate to Nucleus plugin with GraalVM native image support
- Replace compose.desktop with nucleus.application DSL - Add GraalVM configuration (BellSoft JDK 25, native image) - Migrate reachability-metadata.json to new unified format - Configure NSIS packaging with proper app name and metadata - Force dark theme only in sample app
1 parent a76918c commit df55025

6 files changed

Lines changed: 73 additions & 69 deletions

File tree

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ compose-ui-tooling = { module = "org.jetbrains.compose.ui:ui-tooling", version.r
4444
compose-ui-tooling-preview = { module = "org.jetbrains.compose.components:components-ui-tooling-preview", version.ref = "compose" }
4545
compose-material-icons-extended = { module = "org.jetbrains.compose.material:material-icons-extended", version = "1.7.3" }
4646
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidx-lifecycle-runtime-ktx" }
47+
nucleus-graalvm-runtime = { module = "io.github.kdroidfilter:nucleus.graalvm-runtime", version = "1.9.1" }
4748

4849
[plugins]
4950

@@ -57,3 +58,4 @@ vannitktech-maven-publish = {id = "com.vanniktech.maven.publish", version = "0.3
5758
dokka = { id = "org.jetbrains.dokka" , version = "2.2.0"}
5859
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
5960
ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" }
61+
nucleus = { id = "io.github.kdroidfilter.nucleus", version = "1.9.1" }

mediaplayer/src/jvmMain/resources/META-INF/native-image/native-image.properties

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,39 @@
1-
[
2-
{
3-
"type": "io.github.kdroidfilter.composemediaplayer.linux.LinuxNativeBridge",
4-
"allDeclaredFields": true,
5-
"allDeclaredMethods": true,
6-
"allDeclaredConstructors": true
7-
},
8-
{
9-
"type": "io.github.kdroidfilter.composemediaplayer.mac.MacNativeBridge",
10-
"allDeclaredFields": true,
11-
"allDeclaredMethods": true,
12-
"allDeclaredConstructors": true
13-
},
14-
{
15-
"type": "io.github.kdroidfilter.composemediaplayer.windows.WindowsNativeBridge",
16-
"allDeclaredFields": true,
17-
"allDeclaredMethods": true,
18-
"allDeclaredConstructors": true
19-
},
20-
{
21-
"type": "java.lang.Runnable",
22-
"methods": [
23-
{ "name": "run", "parameterTypes": [] }
1+
{
2+
"reflection": [
3+
{
4+
"type": "io.github.kdroidfilter.composemediaplayer.linux.LinuxNativeBridge",
5+
"allDeclaredFields": true,
6+
"allDeclaredMethods": true,
7+
"allDeclaredConstructors": true,
8+
"jniAccessible": true
9+
},
10+
{
11+
"type": "io.github.kdroidfilter.composemediaplayer.mac.MacNativeBridge",
12+
"allDeclaredFields": true,
13+
"allDeclaredMethods": true,
14+
"allDeclaredConstructors": true,
15+
"jniAccessible": true
16+
},
17+
{
18+
"type": "io.github.kdroidfilter.composemediaplayer.windows.WindowsNativeBridge",
19+
"allDeclaredFields": true,
20+
"allDeclaredMethods": true,
21+
"allDeclaredConstructors": true,
22+
"jniAccessible": true
23+
},
24+
{
25+
"type": "java.lang.Runnable",
26+
"methods": [
27+
{
28+
"name": "run",
29+
"parameterTypes": []
30+
}
31+
]
32+
}
33+
],
34+
"resources": [
35+
{
36+
"glob": "composemediaplayer/native/**"
37+
}
2438
]
25-
}
26-
]
39+
}

sample/composeApp/build.gradle.kts

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
@file:OptIn(ExperimentalWasmDsl::class)
22

3+
import io.github.kdroidfilter.nucleus.desktop.application.dsl.CompressionLevel
34
import org.apache.tools.ant.taskdefs.condition.Os
4-
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
5+
import io.github.kdroidfilter.nucleus.desktop.application.dsl.TargetFormat
56
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
67
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
78

@@ -10,6 +11,7 @@ plugins {
1011
alias(libs.plugins.compose.compiler)
1112
alias(libs.plugins.compose)
1213
alias(libs.plugins.android.application)
14+
alias(libs.plugins.nucleus)
1315
}
1416

1517

@@ -81,6 +83,7 @@ kotlin {
8183

8284
jvmMain.dependencies {
8385
implementation(compose.desktop.currentOs)
86+
implementation(libs.nucleus.graalvm.runtime)
8487
}
8588
webMain.dependencies {
8689
implementation(libs.kotlinx.browser)
@@ -106,24 +109,32 @@ dependencies {
106109
debugImplementation(libs.compose.ui.tooling)
107110
}
108111

109-
compose.desktop {
110-
application {
111-
mainClass = "sample.app.MainKt"
112-
113-
nativeDistributions {
114-
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
115-
packageName = "sample"
116-
packageVersion = "1.0.0"
117-
linux {
118-
modules("jdk.security.auth", "jdk.accessibility")
119-
}
120-
macOS {
121-
jvmArgs(
122-
"-Dapple.awt.application.appearance=system"
123-
)
124-
}
112+
nucleus.application {
113+
mainClass = "sample.app.MainKt"
114+
115+
nativeDistributions {
116+
targetFormats(TargetFormat.Dmg, TargetFormat.Nsis, TargetFormat.Deb)
117+
packageName = "Compose Media Player"
118+
description = "A Kotlin Multiplatform media player built with Compose"
119+
vendor = "KDroidFilter"
120+
cleanupNativeLibs = true
121+
packageVersion = "1.0.0"
122+
compressionLevel = CompressionLevel.Maximum
123+
windows {
124+
shortcut = true
125125
}
126126
}
127+
128+
graalvm {
129+
isEnabled = true
130+
imageName = "compose-media-player"
131+
javaLanguageVersion = 25
132+
jvmVendor = JvmVendorSpec.BELLSOFT
133+
buildArgs.addAll(
134+
"-H:+AddAllCharsets",
135+
"-Djava.awt.headless=false"
136+
)
137+
}
127138
}
128139

129140

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package sample.app.theme
22

3-
import androidx.compose.foundation.isSystemInDarkTheme
43
import androidx.compose.material3.MaterialTheme
54
import androidx.compose.material3.darkColorScheme
6-
import androidx.compose.material3.lightColorScheme
75
import androidx.compose.runtime.Composable
86
import androidx.compose.ui.graphics.Color
97

@@ -33,34 +31,12 @@ private val DarkScheme = darkColorScheme(
3331
outlineVariant = Color(0xFF49454F),
3432
)
3533

36-
private val LightScheme = lightColorScheme(
37-
primary = Color(0xFF5B4FC4),
38-
onPrimary = Color.White,
39-
primaryContainer = Color(0xFFE8DEFF),
40-
onPrimaryContainer = Color(0xFF1A0063),
41-
secondary = Color(0xFF006A6A),
42-
onSecondary = Color.White,
43-
secondaryContainer = Color(0xFF9CF1F0),
44-
onSecondaryContainer = Color(0xFF002020),
45-
tertiary = Color(0xFF8C4A3B),
46-
onTertiary = Color.White,
47-
tertiaryContainer = Color(0xFFFFDAD4),
48-
onTertiaryContainer = Color(0xFF3A0905),
49-
background = Color(0xFFFCF8FF),
50-
onBackground = Color(0xFF1C1B1F),
51-
surface = Color(0xFFFCF8FF),
52-
onSurface = Color(0xFF1C1B1F),
53-
surfaceVariant = Color(0xFFE8E0F0),
54-
onSurfaceVariant = Color(0xFF49454F),
55-
)
56-
5734
@Composable
5835
fun AppTheme(
59-
darkTheme: Boolean = isSystemInDarkTheme(),
6036
content: @Composable () -> Unit,
6137
) {
6238
MaterialTheme(
63-
colorScheme = if (darkTheme) DarkScheme else LightScheme,
39+
colorScheme = DarkScheme,
6440
content = content,
6541
)
6642
}

sample/composeApp/src/jvmMain/kotlin/sample/app/main.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import androidx.compose.ui.unit.dp
44
import androidx.compose.ui.window.Window
55
import androidx.compose.ui.window.application
66
import androidx.compose.ui.window.rememberWindowState
7-
fun main() {
7+
import io.github.kdroidfilter.nucleus.graalvm.GraalVmInitializer
8+
9+
fun main() {
10+
GraalVmInitializer.initialize()
811
application {
912
val windowState = rememberWindowState(width = 720.dp, height = 1000.dp)
1013
Window(

0 commit comments

Comments
 (0)