11import org.jetbrains.kotlin.gradle.dsl.JvmTarget
22
33plugins {
4- alias(libs.plugins.kotlin)
4+ alias(libs.plugins.kotlin.jvm)
5+ alias(libs.plugins.kotlin.compose)
56 alias(libs.plugins.kotlin.serialization)
7+ alias(libs.plugins.compose)
68 alias(libs.plugins.shadow)
79 application
810 `maven- publish`
@@ -11,10 +13,33 @@ plugins {
1113
1214group = " app.morphe"
1315
16+ // ============================================================================
17+ // JVM / Kotlin Configuration
18+ // ============================================================================
19+ kotlin {
20+ jvmToolchain {
21+ languageVersion.set(JavaLanguageVersion .of(17 ))
22+ vendor.set(JvmVendorSpec .ADOPTIUM )
23+ }
24+ compilerOptions {
25+ jvmTarget.set(JvmTarget .JVM_17 )
26+ }
27+ }
28+
29+ // ============================================================================
30+ // Application Entry Point
31+ // ============================================================================
32+ // Shadow JAR reads this for Main-Class manifest attribute.
33+ //
34+ // No args / double-click → GUI (Compose Desktop)
35+ // With args (terminal) → CLI (PicoCLI)
1436application {
15- mainClass = " app.morphe.cli.command.MainCommandKt "
37+ mainClass.set( " app.morphe.MorpheLauncherKt " )
1638}
1739
40+ // ============================================================================
41+ // Repositories
42+ // ============================================================================
1843repositories {
1944 mavenLocal()
2045 mavenCentral()
@@ -36,25 +61,67 @@ dependencies {
3661 api(libs.morphe.patcher)
3762 implementation(libs.arsclib)
3863 implementation(libs.morphe.library)
39- implementation(libs.kotlinx.coroutines.core)
40- implementation(libs.kotlinx.serialization.json)
4164 implementation(libs.picocli)
4265
66+ // -- Compose Desktop ---------------------------------------------------
67+ // Platform-independent: single JAR runs on all supported OSes.
68+ // Skiko auto-detects the OS at runtime and loads the correct native library.
69+ implementation(compose.desktop.macos_arm64)
70+ implementation(compose.desktop.macos_x64)
71+ implementation(compose.desktop.linux_x64)
72+ implementation(compose.desktop.linux_arm64)
73+ implementation(compose.desktop.windows_x64)
74+ implementation(compose.components.resources)
75+ @Suppress(" DEPRECATION" )
76+ implementation(compose.material3)
77+ implementation(compose.materialIconsExtended)
78+
79+ // -- Async / Serialization ---------------------------------------------
80+ implementation(libs.kotlinx.coroutines.core)
81+ implementation(libs.kotlinx.coroutines.swing)
82+ implementation(libs.kotlinx.serialization.json)
83+ // testImplementation(libs.kotlin.test)
84+ // }
85+
86+ // -- Networking (GUI) --------------------------------------------------
87+ implementation(libs.ktor.client.core)
88+ implementation(libs.ktor.client.cio)
89+ implementation(libs.ktor.client.content.negotiation)
90+ implementation(libs.ktor.serialization.kotlinx.json)
91+ implementation(libs.ktor.client.logging)
92+
93+ // -- DI / Navigation (GUI) ---------------------------------------------
94+ implementation(platform(libs.koin.bom))
95+ implementation(libs.koin.core)
96+ implementation(libs.koin.compose)
97+
98+ implementation(libs.voyager.navigator)
99+ implementation(libs.voyager.screenmodel)
100+ implementation(libs.voyager.koin)
101+ implementation(libs.voyager.transitions)
102+
103+ // -- APK Parsing (GUI) -------------------------------------------------
104+ implementation(libs.apk.parser)
105+
106+ // -- Testing -----------------------------------------------------------
43107 testImplementation(libs.kotlin.test)
44108 testImplementation(libs.junit.params)
109+ testImplementation(libs.mockk)
45110}
46111
47- kotlin {
48- compilerOptions {
49- jvmTarget.set(JvmTarget .JVM_11 )
112+ // ============================================================================
113+ // Tasks
114+ // ============================================================================
115+ tasks {
116+ jar {
117+ manifest {
118+ attributes(
119+ " Implementation-Title" to project.name,
120+ " Implementation-Version" to project.version
121+ )
122+ }
50123 }
51- }
52124
53- java {
54- targetCompatibility = JavaVersion .VERSION_11
55- }
56-
57- tasks {
58125 test {
59126 useJUnitPlatform()
60127 testLogging {
@@ -63,9 +130,15 @@ tasks {
63130 }
64131
65132 processResources {
66- expand(" projectVersion" to project.version)
133+ // Only expand properties files, not binary files like PNG/ICO
134+ filesMatching(" **/*.properties" ) {
135+ expand(" projectVersion" to project.version)
136+ }
67137 }
68138
139+ // -------------------------------------------------------------------------
140+ // Shadow JAR — the only distribution artifact
141+ // -------------------------------------------------------------------------
69142 shadowJar {
70143 exclude(
71144 " /prebuilt/linux/aapt" ,
@@ -75,14 +148,31 @@ tasks {
75148 minimize {
76149 exclude(dependency(" org.bouncycastle:.*" ))
77150 exclude(dependency(" app.morphe:morphe-patcher" ))
151+ // Ktor uses ServiceLoader
152+ exclude(dependency(" io.ktor:.*" ))
153+ // Koin uses reflection
154+ exclude(dependency(" io.insert-koin:.*" ))
78155 }
156+
157+ mergeServiceFiles()
158+ }
159+
160+ distTar {
161+ duplicatesStrategy = DuplicatesStrategy .EXCLUDE
162+ }
163+
164+ distZip {
165+ duplicatesStrategy = DuplicatesStrategy .EXCLUDE
79166 }
80167
81168 publish {
82169 dependsOn(shadowJar)
83170 }
84171}
85172
173+ // ============================================================================
174+ // Publishing / Signing
175+ // ============================================================================
86176// Needed by gradle-semantic-release-plugin.
87177// Tracking: https://github.com/KengoTODA/gradle-semantic-release-plugin/issues/435
88178
0 commit comments