plugins { id 'java' } allprojects { apply plugin: 'java' group = project.mod_group version = project.mod_version java { toolchain.languageVersion = JavaLanguageVersion.of(21) } tasks.withType(JavaCompile).configureEach { options.release = 21 options.encoding = 'UTF-8' } repositories { maven { url = 'https://maven.fabricmc.net/' } maven { url = 'https://maven.neoforged.net/releases/' } mavenCentral() } } // ───── merged jar ────────────────────────────────────────────────────────── // fabric + neoforge 각각의 remapJar 결과물을 한 jar 안에 압축해서 단일 배포물 생성. // 같은 클래스(common 코드)는 한 번만 포함. 각 로더는 자신의 mod metadata // (fabric.mod.json / META-INF/neoforge.mods.toml) 만 인식해서 자기 쪽 진입점만 로드. tasks.register('mergedJar', Jar) { dependsOn ':fabric:relocatedJar', ':neoforge:jar' archiveBaseName = project.mod_id archiveVersion = project.mod_version archiveClassifier = 'all' destinationDirectory = file('build/libs') duplicatesStrategy = DuplicatesStrategy.EXCLUDE // Fabric: Shadow(relocatedJar) 가 common 패키지를 kr.tkrmagid.chatanswer.fabric.core 로 옮긴 jar // NeoForge: common 은 그대로 kr.tkrmagid.chatanswer.core 에 위치 // → 같은 클래스명 다른 매핑이라도 패키지 경로가 달라서 공존 가능 from(zipTree(project(':fabric').tasks.named('relocatedJar').flatMap { it.archiveFile })) from(zipTree(project(':neoforge').tasks.named('jar').flatMap { it.archiveFile })) { // META-INF/MANIFEST.MF 는 Fabric 측 것을 그대로 사용 (둘 다 단순 manifest) exclude 'META-INF/MANIFEST.MF' } } tasks.register('buildAll') { dependsOn 'mergedJar' }