当前位置: 首页 > news >正文

Minecraft Fabric - java.lang.NoClassDefFoundError HttpUriRequest

原文链接:Minecraft Fabric - java.lang.NoClassDefFoundError HttpUriRequest

0.引言

在开发Fabric插件时难免需要引用外部库,如http客户端,websocket客户端之类。在IDEA内构建插件一切正常,也开启项目内的服务器进行测试,插件也能正常实现功能。于是就直接将构建后的插件丢给服主(帮一个在玩的服务器写的聊天互通插件)。但没一会就一堆消息发来说服务器一启动就会崩溃,我非常奇怪,明明在我电脑上能正常运行,为啥到其他电脑上就不行了??

后面一检查问题:java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest

欸,很明显是缺少了HttpClient这个库,于是在网上查了很久。不得不吐槽一下国内Fabric模组开发环境,就不说有没有人去写模组了,毕竟闷声发大财的大佬挺多。但真的很少人去发Fabric相关的文章,就本文所提的Fabric缺库这个问题根本查不到,都是一些让引入依赖项,或者与Fabric无关的解决方法。那让我们看看怎么解决这个问题吧。

1. 解决方案

本方案适用于Gradle,Maven没用过请自行寻找解决方案。(毕竟官方的项目构建器默认用的Gradle)。先直接给出解决方法,然后再来说说为什么用Shadow Gradle这类Gradle插件不行。

你需要前往 build.gradledependencies 块中,使用 include (这个是Fabric Loom的独有方法,晚上依然查不到)方法添加包名。在构建时就会自动下载指定包并在构建时一并嵌入。

可以看到除了httpclient库,还引用了slf4j库。Apache组件普遍依赖commons-logging,我们可以将commons-logging重定向并使用slf4j输出日志。

我们可以用 jar tf xxx.jar查看打包后的jar结构,可以看到我们需要的依赖库也被打包进插件中了

包名不知道写什么?这一部分可以完全借助AI,例如:

提示词:
我开发的Fabric插件代码中引用了这些包
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
运行时:java.lang.NoClassDefFoundError: org/apache/http/HttpRequest
应该如何在 build.gradle的dependencies块中用include方法补全缺失包?

Q: 为什么不是用implementation而是include

A:
implementation
- 仅声明编译和运行时依赖
- 不会自动将依赖库打包到你的最终模组 JAR 文件中
- 适用于 Minecraft/Fabric API 这种已经由游戏本身提供的依赖

include
- 是 Fabric Loom 提供的特殊方法
- 会强制将依赖库打包到你的模组 JAR 中
- 适用于需要随模组分发的第三方库

2. 为什么 Shadow Gradle 不行?

Shadow Jar 是一个用于创建包含所有依赖项的可执行 JAR 文件的 Gradle 插件。它的主要目的是将项目的所有依赖项(包括传递依赖)合并到一个独立的可执行 JAR 文件中,以简化应用程序的部署和分发。

但是!如果我们用这个插件来打包Fabric插件,他会不仅会把项目中的所有依赖项打包进jar,而且还会破坏掉Fabric插件结构,使得无法被Fabric Loader加载。

通过上面的手动指定依赖项的方式打包插件,最终大小仅1.1MB

而通过 Shadow Gradle打包的插件,大小达到97MB,打开包查看发现塞了很多无关的东西。

相关文章:

  • Spring Boot是什么?MybatisPlus常用注解,LambdaQueryWrapper常用方法
  • OpenHarmony 4.1版本应用升级到5.0版本问题记录及解决方案
  • vue开发中常用方法笔记
  • 在公司快速查看与固定内网IP地址的完整指南
  • 全链路解析:影刀RPA+Coze API自动化工作流实战指南
  • 2025电工杯A题数据-光伏电站发电功率预测数据 收集策略
  • Docker 与 Kubernetes 部署 RabbitMQ 集群(二)
  • docker初学
  • w~大模型~合集4
  • 【Linux系列】EVS 与 VBD 的对比
  • nvidia Thor U与qualcomm 8295 DMPIS算力测试对比
  • 用matlab提取abaqus odb文件中的节点信息
  • 谢飞机的Spring WebFlux面试之旅:从基础到深入
  • 服务接口鉴权与内部认证:自定义注解与AOP实现的企业级实践
  • 免杀一 线程加载
  • Excel 打开密码:守护数据安全的 “钥匙”
  • MySQL:备份还原数据库(mysqldump)
  • c# 解码 encodeURIComponent
  • RocketMQ 生产消费消息消息解析与重试机制详解
  • [GHCTF 2025]ret2libc1(NSSCTF)
  • 一个人在线观看免费社区/seo外包公司是啥
  • 蒙牛网站建设报价情况/建站abc官方网站
  • 网站设计目标 优帮云/谷歌浏览器在线打开
  • 在线简历/百度官方优化软件
  • 上海做电缆桥架的公司网站/今日国际新闻摘抄
  • dw怎样做网站切换/网站运营管理