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 模组问题。 只要它能正常工作就行

编辑推荐精选

博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
商汤小浣熊

商汤小浣熊

最强AI数据分析助手

小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。

imini AI

imini AI

像人一样思考的AI智能体

imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。

下拉加载更多