plugins { id 'java' } allprojects { apply plugin: 'java' group = project.mod_group version = project.mod_version // 기본 JDK toolchain 은 Java 25 (26.x Loom 빌드 요구). subproject 가 필요하면 // 자체 release 21 등으로 다운그레이드. java { toolchain.languageVersion = JavaLanguageVersion.of(25) } tasks.withType(JavaCompile).configureEach { options.release = 25 options.encoding = 'UTF-8' } repositories { maven { url = 'https://maven.fabricmc.net/' } maven { url = 'https://maven.neoforged.net/releases/' } mavenCentral() } } // ───── 단일 배포 jar 컨테이너 ──────────────────────────────────────────────── // 한 jar 가 어떤 환경에서도 동작하도록: // * outer = NeoForge 1.21.6 모드 본체 (NeoForge 만 fabric.mod.json 을 무시) // + 메타로 fabric.mod.json (entrypoint 없는 컨테이너) // * META-INF/jars/ = Fabric 용 nested jar 둘 (1.21.6 / 26.1.2) // Fabric Loader 가 depends.minecraft 로 자동 매칭. NeoForge 는 무시. // // 결과: chat_answer-.jar 한 개를 Fabric 1.21.6 / Fabric 26.1.2 / NeoForge // 1.21.6 어디에 넣어도 적절한 코드 경로가 활성화된다. tasks.register('containerJar', Jar) { dependsOn ':fabric-1216:remapJar', ':fabric-2612:remapJar', ':neoforge-1216:jar' archiveBaseName = project.mod_id archiveVersion = project.mod_version archiveClassifier = '' destinationDirectory = file('build/libs') duplicatesStrategy = DuplicatesStrategy.EXCLUDE // 1. NeoForge 모드 본체 (classes + META-INF/neoforge.mods.toml + icon.png) 을 통째로. // MANIFEST.MF 는 새 jar 가 자체적으로 생성하니 제외. from(zipTree(project(':neoforge-1216').tasks.named('jar').flatMap { it.archiveFile })) { exclude 'META-INF/MANIFEST.MF' } // 2. Fabric 컨테이너 메타데이터 (entrypoint 없이 그냥 "외피") 와 아이콘. // fabric.mod.json 의 ${version} 만 치환. filteringCharset = 'UTF-8' from("${rootDir}/container-resources") { filesMatching("fabric.mod.json") { expand("version": project.mod_version) } } // 3. Fabric nested jars (Fabric Loader 가 META-INF/jars/ 를 스캔해서 // depends.minecraft 매칭되는 jar 만 활성화). into('META-INF/jars') { from project(':fabric-1216').tasks.named('remapJar').flatMap { it.archiveFile } from project(':fabric-2612').tasks.named('remapJar').flatMap { it.archiveFile } } } tasks.register('buildAll') { dependsOn 'containerJar' }