From 8c638e8ea20312bc00878af46efc8768aaa923f0 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:27:19 +0200 Subject: [PATCH 1/2] Replace Shadow JAR with proper JiJ implementation --- build.gradle.kts | 75 ++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 455808b036..9aefc876d6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id("fabric-loom") version "1.11-SNAPSHOT" id("maven-publish") - id("com.gradleup.shadow") version "9.2.2" } base { @@ -50,7 +49,7 @@ repositories { } val modInclude: Configuration by configurations.creating -val library: Configuration by configurations.creating +val jij: Configuration by configurations.creating configurations { // include mods @@ -61,12 +60,12 @@ configurations { extendsFrom(modInclude) } - // include libraries + // include libraries (jar-in-jar) implementation.configure { - extendsFrom(library) + extendsFrom(jij) } - shadow.configure { - extendsFrom(library) + include.configure { + extendsFrom(jij) } } @@ -93,16 +92,35 @@ dependencies { modCompileOnly("com.terraformersmc:modmenu:${properties["modmenu_version"] as String}") // Libraries - library("meteordevelopment:orbit:${properties["orbit_version"] as String}") - library("org.meteordev:starscript:${properties["starscript_version"] as String}") - library("meteordevelopment:discord-ipc:${properties["discordipc_version"] as String}") - library("org.reflections:reflections:${properties["reflections_version"] as String}") - library("io.netty:netty-handler-proxy:${properties["netty_version"] as String}") { isTransitive = false } - library("io.netty:netty-codec-socks:${properties["netty_version"] as String}") { isTransitive = false } - library("de.florianmichael:WaybackAuthLib:${properties["waybackauthlib_version"] as String}") - - // Launch sub project - shadow(project(":launch")) + jij("meteordevelopment:orbit:${properties["orbit_version"] as String}") + jij("org.meteordev:starscript:${properties["starscript_version"] as String}") + jij("meteordevelopment:discord-ipc:${properties["discordipc_version"] as String}") + jij("org.reflections:reflections:${properties["reflections_version"] as String}") + jij("io.netty:netty-handler-proxy:${properties["netty_version"] as String}") { isTransitive = false } + jij("io.netty:netty-codec-socks:${properties["netty_version"] as String}") { isTransitive = false } + jij("de.florianmichael:WaybackAuthLib:${properties["waybackauthlib_version"] as String}") +} + +// Handle transitive dependencies for jar-in-jar +// Based on implementation from BaseProject by FlorianMichael/EnZaXD +// Source: https://github.com/FlorianMichael/BaseProject/blob/main/src/main/kotlin/de/florianmichael/baseproject/Fabric.kt +// Licensed under Apache License 2.0 +afterEvaluate { + val jijConfig = configurations.findByName("jij") ?: return@afterEvaluate + + jijConfig.incoming.resolutionResult.allDependencies.forEach { dep -> + val requested = dep.requested.displayName + + val compileOnlyDep = dependencies.create(requested) { + isTransitive = false + } + + val implDep = dependencies.create(compileOnlyDep) + + dependencies.add("compileOnlyApi", compileOnlyDep) + dependencies.add("implementation", implDep) + dependencies.add("include", compileOnlyDep) + } } loom { @@ -141,6 +159,10 @@ tasks { rename { "${it}_${inputs.properties["archivesName"]}" } } + // Launch sub project + dependsOn(":launch:compileJava") + from(project(":launch").layout.buildDirectory.dir("classes/java/main")) + manifest { attributes["Main-Class"] = "meteordevelopment.meteorclient.Main" } @@ -162,27 +184,6 @@ tasks { options.compilerArgs.add("-Xlint:unchecked") } - shadowJar { - configurations = listOf(project.configurations.shadow.get()) - - inputs.property("archivesName", project.base.archivesName.get()) - - from("LICENSE") { - rename { "${it}_${inputs.properties["archivesName"]}" } - } - - dependencies { - exclude { - it.moduleGroup == "org.slf4j" - } - } - } - - remapJar { - dependsOn(shadowJar) - inputFile.set(shadowJar.get().archiveFile) - } - javadoc { with(options as StandardJavadocDocletOptions) { addStringOption("Xdoclint:none", "-quiet") From 4f22be5a93972f48d5a19e7dd4238d1c6374d55f Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:25:54 +0200 Subject: [PATCH 2/2] Exclude unnecessary deps from final JAR - `slf4j` is provided by Minecraft/Fabric - `jsr305` is used for comp-time annotations --- build.gradle.kts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 9aefc876d6..8c122a2fa4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -108,9 +108,18 @@ dependencies { afterEvaluate { val jijConfig = configurations.findByName("jij") ?: return@afterEvaluate + // Dependencies to exclude from jar-in-jar + val excluded = setOf( + "org.slf4j", // Logging provided by Minecraft + "jsr305" // Compile time annotations only + ) + + jijConfig.incoming.resolutionResult.allDependencies.forEach { dep -> val requested = dep.requested.displayName + if (excluded.any { requested.contains(it) }) return@forEach + val compileOnlyDep = dependencies.create(requested) { isTransitive = false }