Forgix

Forgix

Minecraft多平台模组整合工具

Forgix是一款Minecraft模组开发工具,可将多个模组加载器整合到单个jar文件中。它巧妙利用JVM特性实现加载器兼容,简化了跨平台模组开发流程。Forgix支持Forge、NeoForge、Fabric、Quilt等主流加载器,提供灵活配置,已稳定应用于生产环境。该工具为模组开发者提供了高效的多平台支持方案,大幅提升了开发效率。

ForgixMinecraft模组开发多平台支持Gradle插件Github开源项目

Forgix

Forgix是一个全新的工具,允许Minecraft模组开发者将多个插件/模组加载器合并到一个jar文件中!

作为普通用户,这对我有什么好处?

你不需要了解太多关于Forgix的信息,因为这是一个面向开发者的工具,但你使用的模组可能只需要下载一个文件,这样你就不用担心要安装哪个模组加载器了。

它是否足够稳定,可以用于生产环境?

是的,在当前状态下,它已经可以用于生产环境,并且在我测试的所有模组上都能正常工作。即使你的模组代码库非常混乱,它也应该能正常工作。如果出现任何问题,只需在GitHub上提出问题即可。 你也可以等待2.0.0更新,这是项目的完全重写版本,但它的发布时间在现在到2096年1月1日(UTC)之间。

它是如何开始的

Forgix最初是一个实验,目的是看看我能否将多个模组加载器合并到一起。我知道这是可能的(尽管很多人说不可能),经过多次尝试和错误,我终于制作出了一个可以进行半自动jar合并的原型,但它实际上相当糟糕,而且只能用于我正在开发的特定模组。 在意识到这是可行的之后,我重写了整个项目,使其可以被公众使用,于是Forgix诞生了。

它是如何工作的

Forgix利用了JVM只加载被调用的类这一特性。通过稍微改变包的结构,我们可以让每个模组加载器只调用自己的包,而不会干扰其他模组加载器。

例如,Quilt进入quilt.mod.json并从那里调用入口点,但我们更新了包的结构,使其只调用Quilt的入口点,而不调用其他模组加载器的入口点。JVM永远不会加载其他类,因为Quilt永远不会调用它们。

使用方法和文档

首先在你的根目录的build.gradle中应用插件

<details closed> <summary>应用插件</summary>

Groovy

使用plugins DSL

<details closed> <summary>点击查看</summary>
plugins { id "io.github.pacifistmc.forgix" version "<version>" }
</details>

使用传统插件应用方式

<details closed> <summary>点击查看</summary>
buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "io.github.pacifistmc.forgix:Forgix:<version>" } } apply plugin: "io.github.pacifistmc.forgix"
</details>

Kotlin

使用plugins DSL

<details closed> <summary>点击查看</summary>
plugins { id("io.github.pacifistmc.forgix") version "<version>" }
</details>

使用传统插件应用方式

<details closed> <summary>点击查看</summary>
buildscript { repositories { maven { url = uri("https://plugins.gradle.org/m2/") } } dependencies { classpath("io.github.pacifistmc.forgix:Forgix:<version>") } } apply(plugin = "io.github.pacifistmc.forgix")
</details>

记得将<version>替换为最新版本!你可以从Forgix Version获取最新版本。


</details>

然后配置它以适应你的模组!这个过程在未来会自动化,但我现在还没有时间去实现。

<details closed> <summary>配置插件使其正常工作</summary>

这是默认情况下应该适用于几乎所有模组的常规配置。

forgix { group = "org.example.mod" mergedJarName = "example-mod" }

group是你的模组的公共包名,mergedJarName将是它创建的合并jar的名称。如果mergedJarName没有扩展名,它会给它添加.jar扩展名,但请注意,有时版本号可能会被检测为扩展名,这种情况下它不会添加.jar扩展名,你需要手动添加。

运行mergeJars任务(在运行build之后)将在Merged文件夹中创建合并的jar。(将来这可能会在build/libs/merged文件夹中)

如果你不想手动运行mergeJars,你可以添加以下内容。(将来这可能会成为默认行为)

subprojects { // ... build.finalizedBy(mergeJars) assemble.finalizedBy(mergeJars) }

</details>

每个Forgix配置的文档!

<details closed> <summary>点击查看</summary>

根容器("forgix")

  • group(字符串)
    • 这是你的模组的公共包名;通常是maven group。
    • 目前是必填值。
  • mergedJarName(字符串)
    • 这是输出jar的名称。如果名称不包含扩展名,会添加.jar扩展名;但有时它会将版本号识别为扩展名而不添加,这种情况下你需要手动将.jar扩展名添加到名称中。
    • 目前是必填值。
  • removeDuplicate(字符串)
    • 这会从合并的jar中移除重复的包。例如,如果你有一个在所有模组加载器中重复但不需要重复的核心包,你可以使用这个来移除重复。
    • 可以多次使用以移除多个重复,但如果有很多重复,最好使用'removeDuplicates',它接受一个列表。
Forge子容器("forge")
  • projectName(字符串)
    • 这是Forge项目的名称。默认设置为"forge"。
  • jarLocation(字符串)
    • 这是projectName指定的项目中构建的Forge jar的位置。默认情况下,它会检索名称最短的jar,这种方法不太完善,但我不知道如何在不依赖loom或类似工具的情况下检索构建的jar,希望将来能有所改进!
  • additionalRelocate(字符串,字符串)
    • 简单来说,这允许你定义更多的group,这对重定位库很有用。
    • 可以多次使用以指定多个重定位。
  • mixin(字符串)
    • 这是因为Forge有时会很麻烦,有时Forge会做一些奇怪的事情,我们无法用正常方式识别mixin。但是,如果我们不自动检测mixin,那么只应该使用这个来明确指定mixin。
    • 可以多次使用以指定多个mixin。
NeoForge子容器("neoforge")
  • projectName(字符串)
    • 这是NeoForge项目的名称。默认设置为"neoforge"。
  • jarLocation(字符串)
    • 这是projectName指定的项目中构建的NeoForge jar的位置。默认情况下,它会检索名称最短的jar,这种方法不太完善,但我不知道如何在不依赖loom或类似工具的情况下检索构建的jar,希望将来能有所改进!
  • additionalRelocate(字符串,字符串)
    • 简单来说,这允许你定义更多的group,这对重定位库很有用。
    • 可以多次使用以指定多个重定位。
  • mixin(字符串)
    • 这是因为NeoForge有时会很麻烦,有时NeoForge会做一些奇怪的事情,我们无法用正常方式识别mixin。但是,如果我们不自动检测mixin,那么只应该使用这个来明确指定mixin。
    • 可以多次使用以指定多个mixin。
Quilt 子容器 ("quilt")
  • projectName (字符串)
    • 这是 Quilt 项目的名称。默认设置为 "quilt"。
  • jarLocation (字符串)
    • 这是projectName 指定的项目构建的 Quilt jar 的位置。默认情况下,它会获取名称最短的 jar,这种方法不太完善,但我不知道如何在不依赖 loom 或类似工具的情况下获取构建的 jar,希望将来能有更好的方法!
  • additionalRelocate (字符串, 字符串)
    • 简单来说,这允许你定义更多的 group,这对重定位库很有用。
    • 可以多次使用以指定多个重定位。
Fabric 子容器 ("fabric")
  • projectName (字符串)
    • 这是 Fabric 项目的名称。默认设置为 "fabric"。
  • jarLocation (字符串)
    • 这是projectName 指定的项目构建的 Fabric jar 的位置。默认情况下,它会获取名称最短的 jar,这种方法不太完善,但我不知道如何在不依赖 loom 或类似工具的情况下获取构建的 jar,希望将来能有更好的方法!
  • additionalRelocate (字符串, 字符串)
    • 简单来说,这允许你定义更多的 group,这对重定位库很有用。
    • 可以多次使用以指定多个重定位。
自定义子容器 ("custom")

因为我不会为每个模组加载器开发新的容器,所以这个容器用来处理其他所有情况。但它无法处理 Forge 类的模组加载器,因为 Forge 比较特殊和复杂。这个配置可以多次使用以指定多个加载器。

  • projectName (字符串)
    • 这是项目的名称。
    • 这是一个必填值。
  • jarLocation (字符串)
    • 这是projectName 指定的项目构建的 jar 的位置。默认情况下,它会获取名称最短的 jar,这种方法不太完善,但我不知道如何在不依赖 loom 或类似工具的情况下获取构建的 jar,希望将来能有更好的方法!
  • additionalRelocate (字符串, 字符串)
    • 简单来说,这允许你定义更多的 group,这对重定位库很有用。
    • 可以多次使用以指定多个重定位。

完整的 Forgix 配置示例:

forgix { group = "org.example.mod" // (必填值) mergedJarName = "example-mod" // (必填值) outputDir = "build/libs/merged" forge { projectName = "forge" jarLocation = "build/libs/example-mod.jar" additionalRelocate "org.my.lib" "forge.org.my.lib" additionalRelocate "org.my.lib.another" "forge.org.my.lib.another" mixin "forge.mixins.json" mixin "forge.mixins.another.json" } neoforge { projectName = "neoforge" jarLocation = "build/libs/example-mod.jar" additionalRelocate "org.my.lib" "neoforge.org.my.lib" additionalRelocate "org.my.lib.another" "neoforge.org.my.lib.another" mixin "neoforge.mixins.json" mixin "neoforge.mixins.another.json" } fabric { projectName = "fabric" jarLocation = "build/libs/example-mod.jar" additionalRelocate "org.my.lib" "fabric.org.my.lib" additionalRelocate "org.my.lib.another" "fabric.org.my.lib.another" } quilt { projectName = "quilt" jarLocation = "build/libs/example-mod.jar" additionalRelocate "org.my.lib" "quilt.org.my.lib" additionalRelocate "org.my.lib.another" "quilt.org.my.lib.another" } custom { projectName = "sponge" // (必填值) jarLocation = "build/libs/example-mod.jar" additionalRelocate "org.my.lib" "sponge.org.my.lib" additionalRelocate "org.my.lib.another" "sponge.org.my.lib.another" } custom { projectName = "spigot" // (必填值) jarLocation = "build/libs/example-mod.jar" additionalRelocate "org.my.lib" "spigot.org.my.lib" additionalRelocate "org.my.lib.another" "spigot.org.my.lib.another" } removeDuplicate "org.example.mod.core" }

这个项目看起来已经停止维护了

取决于你所处的未来时间点,它很可能确实已经停止维护。我不会每天更新这个项目;所有未来的更新都将是修复我尚未发现的错误、改善使用体验,或解决那些由于代码库过于复杂而无法正常工作的 Minecraft 模组问题。 只要它能正常工作就行

编辑推荐精选

音述AI

音述AI

全球首个AI音乐社区

音述AI是全球首个AI音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。

QoderWork

QoderWork

阿里Qoder团队推出的桌面端AI智能体

QoderWork 是阿里推出的本地优先桌面 AI 智能体,适配 macOS14+/Windows10+,以自然语言交互实现文件管理、数据分析、AI 视觉生成、浏览器自动化等办公任务,自主拆解执行复杂工作流,数据本地运行零上传,技能市场可无限扩展,是高效的 Agentic 生产力办公助手。

lynote.ai

lynote.ai

一站式搞定所有学习需求

不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。

AniShort

AniShort

为AI短剧协作而生

专为AI短剧协作而生的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。

seedancetwo2.0

seedancetwo2.0

能听懂你表达的视频模型

Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。

nano-banana纳米香蕉中文站

nano-banana纳米香蕉中文站

国内直接访问,限时3折

输入简单文字,生成想要的图片,纳米香蕉中文站基于 Google 模型的 AI 图片生成网站,支持文字生图、图生图。官网价格限时3折活动

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

堆友

堆友

多风格AI绘画神器

堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。

图像生成热门AI工具AI图像AI反应堆AI工具箱AI绘画GOAI艺术字堆友相机
码上飞

码上飞

零代码AI应用开发平台

零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

下拉加载更多