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

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,打开包查看发现塞了很多无关的东西。

http://www.xdnf.cn/news/8343.html

相关文章:

  • windows 下用yolov5 训练模型 给到opencv 使用
  • CSS padding(填充)
  • CSS2相关知识点
  • C语言拼接4字节数据为uint32_t
  • 【CSS学习笔记1】css基础知识介绍
  • 2025年开源大模型技术全景图
  • Mistral AI 开源最新 Small 模型——Devstral-Small-2505
  • 从源码编译支持ffmpeg(H264编码)的opencv(创建mp4视频报错:H264 is not supported with codec id 28)
  • 【动手学深度学习】2.3. 线性代数
  • AWS云与第三方通信最佳实践:安全、高效的数据交互方案
  • NDVI谐波拟合(基于GEE实现)
  • Cat.4+WiFi6工业路由器介绍小体积大作用ER4200
  • 第29周———Inception v3算法实战与解析
  • epub→pdf | which 在线转换??好用!!
  • uniapp uts 插件开发指南
  • 多模态AI终极形态?GPT-5与Stable Diffusion 3的融合实验报告
  • C++中IOstream解析
  • 二十三、面向对象底层逻辑-BeanDefinitionParser接口设计哲学
  • 公有云AWS基础架构与核心服务:从概念到实践
  • Windows 使用 WSL 安装 Ubuntu
  • vue项目表格甘特图开发
  • ArcGIS Pro对图斑进行等比例、等面积、等宽度的分割
  • word为章节标题添加自动编号
  • React Hooks底层执行逻辑详解、自定义Hooks、FiberScheduler
  • Prompt Tuning:轻量级微调与反向传播揭秘
  • 分布式缓存:缓存的三种读写模式及分类
  • Wkhtmltopdf使用
  • 医学人工智能中的分层处理与跨模态融合:深度架构设计研究(基础教程.上)
  • 从负债到上岸:湖北理元理律师事务所的专业债务规划之道
  • 如何升级 npm:从版本管理到最佳实践