Maven构建Minecraft Java插件出现MongoClientURI类未找到报错如何解决
问题根因
这个java.lang.NoClassDefFoundError: com/mongodb/MongoClientURI报错是因为MongoDB驱动的相关类没有被正确打包到你最终发布的插件jar包中,你当前的pom.xml配置存在多个打包插件冲突、冗余配置的问题。
解决步骤
- 第一步:删除pom.xml中多余的打包插件,仅保留maven-compiler-plugin和maven-shade-plugin即可,
maven-assembly-plugin和maven-jar-plugin完全不需要:Spigot插件的主类通过
plugin.yml指定,不需要在jar的manifest中配置mainClass,同时使用shade和assembly两个打包插件会导致输出的jar被互相覆盖,最终得到没有包含依赖的版本。 - 第二步:修改maven-shade-plugin的配置,添加依赖过滤和包重定向规则,避免和服务端自带的Mongo驱动版本冲突:
正确的shade配置如下:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <!-- 过滤掉scope为provided的依赖,避免把spigot-api打进jar包 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> <!-- 包重定向,避免和服务端自带的Mongo类冲突 --> <relocations> <relocation> <pattern>com.mongodb</pattern> <shadedPattern>ca.lwi.battlepot.mongo.lib.com.mongodb</shadedPattern> </relocation> <relocation> <pattern>org.bson</pattern> <shadedPattern>ca.lwi.battlepot.mongo.lib.org.bson</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> - 第三步:执行
mvn clean package命令打包,打包完成后从target目录下取文件名不带original前缀的jar包,放到服务端的plugins文件夹中即可。 - 第四步:可选验证:用解压工具打开你打包好的插件jar,检查是否存在上述shadedPattern路径下的MongoClientURI类,存在则说明依赖打包成功。
内容的提问来源于stack exchange,提问作者Lwi
相关产品推荐
相关产品推荐

