Restructure into multi-loader (Fabric + NeoForge) with merged jar

common 디렉토리에 로더 비종속 ChatAnswerCore 를 두고, fabric/ 과 neoforge/
서브프로젝트가 각자 진입점만 갖도록 분리. 두 결과물을 하나의 jar 로 묶기 위해
Fabric 측 common 클래스를 Shadow 의 relocate 로 kr.tkrmagid.chatanswer.fabric.core
패키지로 옮긴다 (Fabric 은 intermediary, NeoForge 는 Mojang 매핑이라 같은 클래스
경로에 그대로 두면 충돌). 루트의 mergedJar 태스크가 :fabric:relocatedJar 와
:neoforge:jar 를 합쳐서 build/libs/chat_answer-<version>-all.jar 생성.

산출물: 9.9KB 통합 jar 가 Fabric / NeoForge 양쪽에서 작동.
This commit is contained in:
Claude
2026-05-13 22:10:30 +09:00
parent 3e59d08db1
commit 2c35e77b8b
12 changed files with 340 additions and 157 deletions

View File

@@ -1,45 +1,53 @@
plugins {
id 'fabric-loom' version '1.10-SNAPSHOT'
id 'java'
}
group = project.mod_group
version = project.mod_version
archivesBaseName = project.mod_id
allprojects {
apply plugin: 'java'
java {
toolchain.languageVersion = JavaLanguageVersion.of(21)
withSourcesJar()
}
group = project.mod_group
version = project.mod_version
repositories {
maven { url = 'https://maven.fabricmc.net/' }
mavenCentral()
}
java {
toolchain.languageVersion = JavaLanguageVersion.of(21)
}
dependencies {
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
}
tasks.withType(JavaCompile).configureEach {
options.release = 21
options.encoding = 'UTF-8'
}
processResources {
inputs.property "version", project.version
inputs.property "mod_id", project.mod_id
filesMatching("fabric.mod.json") {
expand "version": project.version, "mod_id": project.mod_id
repositories {
maven { url = 'https://maven.fabricmc.net/' }
maven { url = 'https://maven.neoforged.net/releases/' }
mavenCentral()
}
}
tasks.withType(JavaCompile).configureEach {
options.release = 21
options.encoding = 'UTF-8'
}
// ───── merged jar ──────────────────────────────────────────────────────────
// fabric + neoforge 각각의 remapJar 결과물을 한 jar 안에 압축해서 단일 배포물 생성.
// 같은 클래스(common 코드)는 한 번만 포함. 각 로더는 자신의 mod metadata
// (fabric.mod.json / META-INF/neoforge.mods.toml) 만 인식해서 자기 쪽 진입점만 로드.
jar {
from("LICENSE") {
rename { "${it}_${project.archivesBaseName}" }
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'
}