minecraft-multiloader について
minecraft-multiloaderは、Architecturyを使うMinecraft MOD開発者向けのガイドです。共通コードを保ち、FabricとNeoForge向けの成果物をビルドできます。
主な機能
- 01common、fabric、neoforgeのプロジェクト構成
- 02Architectury APIによるプラットフォーム差の抽象化
- 03@ExpectPlatformによる個別実装
- 04バージョン設定の静的チェック
- 05FabricとNeoForgeのJARビルド
活用シーン
- 01FabricとNeoForgeでMODコードを共有
- 02共通処理とローダー固有実装を分離
- 03Gradleプロパティのバージョン設定を確認
- 04両プラットフォームの成果物をビルドして確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jahrome907/ minecraft-agent-skills --skill minecraft-multiloaderインストール後、Claude Code で/minecraft-multiloaderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/architectury-reference.mdlegacy-1.21.11-template.mdscripts/check-version-sanity.sh詳細
Minecraft Multiloader Skill(Architectury)
Architectury とは?
Architectury は、1 つの MOD コードベースを記述し、NeoForge と Fabric の両方の JAR にコンパイルできるフレームワークです。
common サブプロジェクトには共有 API があり、プラットフォームサブプロジェクトは @ExpectPlatform 抽象化の背後でプラットフォーム固有の動作を実装します。
適用範囲
Use when: 1 つの共有コードベースで NeoForge と Fabric の両方の成果物をビルドして配布する必要がある場合。Do not use when: プロジェクトが単一ローダーのみを対象とする場合(両方ではなく、NeoForge または Fabric 向けのminecraft-moddingを使用)。Do not use when: Paper/Bukkit プラグインを開発する場合(minecraft-plugin-dev)。
| コンポーネント | 目的 |
|---|---|
architectury-loom | Gradle プラグイン — Fabric Loom を拡張し、マルチローダーをサポートします |
architectury-api | ランタイムライブラリ — 両プラットフォームの抽象化を提供します |
@ExpectPlatform | プラットフォーム固有の実装を持つメソッドを示すアノテーション |
common/ | 共有コード(ローダー固有の API は使用しません) |
fabric/ | Fabric 固有のコードとエントリーポイント |
neoforge/ | NeoForge 固有のコードとエントリーポイント |
バージョン(Minecraft 1.21.11)
# gradle.properties property names used by this skill's static helper.
# Get every tool version from the exact generated or known-working project.
mod_version=1.0.0
minecraft_version=1.21.11
enabled_platforms=fabric,neoforge
architectury_version=<project pin>
fabric_loader_version=<project pin>
fabric_api_version=<project pin ending in +1.21.11>
neoforge_version=<project pin in the 21.11.x family>
loom_version=<project pin>
architectury_version、Architectury プラグインのバージョン、loom_version は、同じ生成済みプロジェクトまたは動作確認済みのプロジェクト系列から指定してください。このスキルでは、特定のバージョンの組み合わせに互換性があるかどうかを静的ヘルパーでは判定できないため、コピーして使える依存関係の一覧は掲載していません。
Minecraft 26.2 / Java 25 では、バージョンセレクターに対象バージョンが正確に表示される場合に限り、公式の Architectury Template Generator を使用してください。Fabric と NeoForge を含む Multiplatform プロジェクトを生成し、生成された Gradle の構成とバージョン指定を一式のまま維持してください。ジェネレーターに対象バージョンがない場合は、そのバージョン系列で動作確認済みのプロジェクトを起点にして、解決済みのビルドを確認してください。1.21.11 テンプレートを 26.2 用として扱わないでください。公開されているテンプレートのダウンロードは、現在の対象に正確に合致するスキャフォールドの代わりにはなりません。
保持されているサンプルの minecraft_version だけを機械的に変更しないでください。26.2 は難読化されておらず、Loom とリマッピングの設定が 1.21.11 とは異なります。
同梱のリファレンスとヘルパー
- バージョン整合性のリファレンス:
references/architectury-reference.md - 整合性チェッカー:
./scripts/check-version-sanity.sh --root <project>
gradle.properties を編集した後に整合性チェッカーを実行してください。これは構文とバージョン系列を事前確認する静的チェックです。キーの不足、スナップショット版の指定、fabric / neoforge プラットフォームの不足、明らかなバージョン系列の不整合を検出します。依存関係の解決やローダーとの互換性の証明は行わず、プロジェクトの Fabric および NeoForge のビルドとスモークテストの代わりにもなりません。
ルートプロジェクトの構成
my-mod/
├── build.gradle ← root build (shared config)
├── settings.gradle
├── gradle.properties
├── common/
│ ├── build.gradle
│ └── src/main/java/com/example/mymod/
│ ├── MyMod.java ← shared init
│ ├── registry/
│ │ └── ModItems.java ← shared registry declarations
│ └── platform/
│ └── PlatformHelper.java ← @ExpectPlatform methods
├── fabric/
│ ├── build.gradle
│ └── src/main/
│ ├── java/com/example/mymod/fabric/
│ │ ├── MyModFabric.java ← Fabric entrypoint
│ ├── java/com/example/mymod/platform/
│ │ └── PlatformHelperImpl.java ← Fabric @ExpectPlatform implementation
│ └── resources/
│ ├── fabric.mod.json
│ └── assets/...
└── neoforge/
├── build.gradle
└── src/main/
├── java/com/example/mymod/neoforge/
│ ├── MyModNeoForge.java ← NeoForge @Mod entry
├── java/com/example/mymod/platform/
│ └── PlatformHelperImpl.java ← NeoForge @ExpectPlatform implementation
└── resources/
├── META-INF/neoforge.mods.toml
└── assets/...
レガシービルドテンプレート
以前の固定 Gradle スクリプトは 1.21.11 のスナップショットであり、現行のスキャフォールドとして提示しないようにしています。サポート対象のどちらのバージョンでも、生成されたビルドファイルを変更する前に
references/legacy-1.21.11-template.md
または references/architectury-reference.md
を参照してください。これらのリファレンスでは、バージョンの基準点とソースセットの境界を維持しつつ、不完全なビルドスクリプトを別の Minecraft 系列にコピーすることを避けられます。
共通コード
common/.../MyMod.java
package com.example.mymod;
import dev.architectury.registry.registries.DeferredRegister;
import dev.architectury.registry.registries.RegistrySupplier;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.Item;
public class MyMod {
public static final String MOD_ID = "mymod";
// Architectury's DeferredRegister — works on both platforms
public static final DeferredRegister<Item> ITEMS =
DeferredRegister.create(MOD_ID, Registries.ITEM);
public static final RegistrySupplier<Item> MY_ITEM =
ITEMS.register("my_item", () -> new Item(new Item.Properties().setId(
ResourceKey.create(Registries.ITEM,
Identifier.fromNamespaceAndPath(MOD_ID, "my_item"))
)));
public static void init() {
ITEMS.register(); // registers with both platforms
}
}
@ExpectPlatform — プラットフォーム固有のメソッド
契約を common/ で定義します。
package com.example.mymod.platform;
import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.world.level.material.Fluid;
public class PlatformHelper {
@ExpectPlatform
public static boolean isModLoaded(String modId) {
// This body is replaced at compile time by the platform implementation
throw new AssertionError("ExpectPlatform implementation not found");
}
@ExpectPlatform
public static boolean isClient() {
throw new AssertionError();
}
}
各プラットフォームの実装は、common の @ExpectPlatform クラスと同じ Java パッケージに配置してください。変更するのは common/、fabric/、neoforge/ のソースセットだけです。
fabric/.../platform/PlatformHelperImpl.java に実装します。
package com.example.mymod.platform;
import net.fabricmc.loader.api.FabricLoader;
// Class name must match: <common class name>Impl
public class PlatformHelperImpl {
public static boolean isModLoaded(String modId) {
return FabricLoader.getInstance().isModLoaded(modId);
}
public static boolean isClient() {
return FabricLoader.getInstance().getEnvironmentType() ==
net.fabricmc.api.EnvType.CLIENT;
}
}
neoforge/.../platform/PlatformHelperImpl.java に実装します。
package com.example.mymod.platform;
import net.neoforged.fml.ModList;
import net.neoforged.fml.loading.FMLEnvironment;
public class PlatformHelperImpl {
public static boolean isModLoaded(String modId) {
return ModList.get().isLoaded(modId);
}
public static boolean isClient() {
return FMLEnvironment.dist.isClient();
}
}
Fabric エントリーポイント
fabric/.../MyModFabric.java
package com.example.mymod.fabric;
import com.example.mymod.MyMod;
import net.fabricmc.api.ModInitializer;
public class MyModFabric implements ModInitializer {
@Override
public void onInitialize() {
MyMod.init();
}
}
fabric/.../resources/fabric.mod.json
この保持対象の 1.21.11 メタデータの例は、 Architectury 1.21.11 の上流ブランチにある最小依存関係に準拠しています。 生成されたプロジェクトで、これより厳しい範囲が指定されている場合は、そちらを維持してください。
{
"schemaVersion": 1,
"id": "mymod",
"version": "${version}",
"name": "My Mod",
"description": "A multiloader example mod",
"license": "MIT",
"environment": "*",
"entrypoints": {
"main": ["com.example.mymod.fabric.MyModFabric"]
},
"depends": {
"fabricloader": ">=0.18.2",
"fabric-api": ">=0.139.4+1.21.11",
"architectury": ">=19.0",
"minecraft": "~1.21.11"
}
}
NeoForge エントリーポイント
neoforge/.../MyModNeoForge.java
package com.example.mymod.neoforge;
import com.example.mymod.MyMod;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
@Mod(MyMod.MOD_ID)
public class MyModNeoForge {
public MyModNeoForge(IEventBus modEventBus) {
MyMod.init();
}
}
neoforge/.../resources/META-INF/neoforge.mods.toml
modLoader = "javafml"
loaderVersion = "[1,)"
license = "MIT"
[[mods]]
modId = "mymod"
version = "${file.jarVersion}"
displayName = "My Mod"
description = "A multiloader example mod"
[[dependencies.mymod]]
modId = "neoforge"
type = "required"
versionRange = "[21.11,)"
ordering = "NONE"
side = "BOTH"
[[dependencies.mymod]]
modId = "minecraft"
type = "required"
versionRange = "[1.21.11,1.22)"
ordering = "NONE"
side = "BOTH"
ビルドコマンド
# Build both JARs simultaneously
./gradlew build
# Inspect the project's actual outputs. Generated templates choose their own
# archive base name and version convention:
find fabric/build/libs neoforge/build/libs -maxdepth 1 -type f -name '*.jar' \
! -name '*-sources.jar' ! -name '*-dev.jar' ! -name '*-javadoc.jar'
# Run in dev environment
./gradlew :fabric:runClient
./gradlew :neoforge:runClient
./gradlew :neoforge:runServer
# Datagen (if applicable)
./gradlew :neoforge:runData
よくある落とし穴
| 落とし穴 | 解決策 |
|---|---|
common/ で net.neoforged.* / net.fabricmc.* を使用する | common ではバニラ MC と Architectury API のみを使用してください |
common で DeferredRegister のフィールドに直接アクセスする(NeoForge スタイル) | Architectury の DeferredRegister を使用してください |
| レジストリキーを指定せずに 26.2 のアイテムを構築する | ResourceKey<Item> を作成し、new Item の前に Item.Properties#setId を呼び出してください |
@ExpectPlatform が実行時に AssertionError をスローすることを忘れる | fabric/ と neoforge/ の両方に、同じパッケージ内で対応する *Impl クラスが必要です |
| fabric/ と neoforge/ でアセットが重複している | アセットは common/src/main/resources/assets/ に配置してください |
| common の Mixin がローダー API をインポートする、または一方のローダーの側を対象にする | そのプラットフォームのサブプロジェクトに配置してください。両方の生成済みプラットフォーム設定に含まれている場合、ローダーに依存しない Mixin は common に配置できます |
| mod の初期化スレッドでワールド/レジストリにアクセスする | セットアップには mod bus イベントを使用し、初期化時にワールドへアクセスしないでください |
参考資料
- Architectury API GitHub:https://github.com/architectury/architectury-api
- Architectury API 26.2 ソースブランチ:https://github.com/architectury/architectury-api/tree/26.2
- Architectury API 1.21.11 ソースブランチ:https://github.com/architectury/architectury-api/tree/1.21.11
- Architectury Loom:https://github.com/architectury/architectury-loom
- Architectury テンプレート:https://github.com/architectury/architectury-templates
- Architectury テンプレートジェネレーター:https://generate.architectury.dev/
- Architectury ドキュメント:https://docs.architectury.dev/