MongoDB与Java连接报错java.lang.NoClassDefFoundError求助
解决Minecraft插件中MongoDB连接的
NoClassDefFoundError问题 你遇到的java.lang.NoClassDefFoundError: com/mongodb/MongoClient本质是运行时Minecraft服务器找不到MongoDB的类文件——毕竟你没法修改服务器的类路径,而普通导出的Jar又不会自动把依赖打包进去。结合你是Minecraft插件开发者的场景,给你几个靠谱的解决方案:
1. 用Maven Shade插件打包(Maven项目首选方案)
在Minecraft插件开发圈里,Shade插件是解决依赖打包问题的标准操作——它会把你所有依赖的类直接合并到你的插件Jar里,这样服务器加载时就能直接找到Mongo的类了。
在你的pom.xml里添加Shade插件的配置:
<build> <plugins> <!-- 保留你原本的Minecraft插件构建插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 替换成你的插件主类全路径 --> <mainClass>com.yourname.YourPluginMain</mainClass> <!-- 过滤掉签名文件,避免打包冲突 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,target目录里带shaded后缀的Jar就是包含所有Mongo依赖的插件包,直接丢到服务器的plugins文件夹即可。
2. 手动合并依赖(普通Java项目方案)
如果是普通Java项目没法用Maven Shade,那就手动把Mongo的类合并到你的插件Jar里:
- 解压
bson.jar、mongodb-driver-core.jar、mongodb-java.jar,取出里面的com文件夹(包含Mongo所有类文件) - 把这个
com文件夹和你插件编译后的class文件放在同一目录下 - 用Jar命令重新打包:
jar cvf YourPlugin.jar 你的class文件目录/ com/ - 生成的Jar就包含了Mongo的类,服务器加载时就能找到
MongoClient
3. 排查常见坑点
- 版本兼容性:确认MongoDB驱动3.6.3和服务器Java版本兼容——3.6.3需要Java 8及以上,如果服务器用的是Java 7,必然会出现类找不到的问题,先执行
java -version检查服务器Java版本 - 依赖范围设置:Maven的Mongo依赖不要设为
provided,这个范围意味着运行时由容器提供,但你没法控制服务器类路径,保持默认的compile范围即可 - 导出选项错误:用Eclipse/IDEA导出Jar时,要选择**"提取所需的库到生成的JAR中"**,而不是"复制到外部文件夹",否则依赖Jar不会被合并进去
内容的提问来源于stack exchange,提问作者Sommervold
相关产品推荐
相关产品推荐

