寻求更简洁的Maven依赖打包方案,解决jBCrypt类缺失错误
解决Spigot插件jBCrypt运行时
NoClassDefFoundError的简洁方案 问题本质
编译阶段Maven能找到jBCrypt依赖,但默认不会把第三方依赖打包进插件Jar,而Spigot运行环境本身不带jBCrypt类,导致运行时找不到类抛出错误。
简洁解决方案
方案1:极简Maven Shade配置
你觉得Shade配置繁琐,但针对单个依赖的配置其实非常精简,在pom.xml的<build>节点下添加:
<plugins> <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> <includes> <include>org.mindrot.jbcrypt:**</include> </includes> </configuration> </execution> </executions> </plugin> </plugins>
执行mvn package后,生成的Jar会自动包含jBCrypt的所有类,直接运行即可。
方案2:直接嵌入jBCrypt类(最简洁但不推荐)
从jBCrypt的官方Jar里提取org/mindrot/jbcrypt/BCrypt.class,复制到你项目的src/main/java/org/mindrot/jbcrypt目录下。这种方法不需要任何Maven配置,编译时类会直接打包进插件Jar。
⚠️ 提示:这种方式会丢失Maven依赖的版本管理能力,后续jBCrypt有安全更新时,你得手动替换类文件,不适合长期维护的项目。
方案3:利用插件Lib目录加载依赖
- 在pom.xml中添加依赖复制插件,把jBCrypt Jar复制到插件的lib目录:
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>copy-jbcrypt</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <includeGroupIds>org.mindrot</includeGroupIds> <includeArtifactIds>jbcrypt</includeArtifactIds> </configuration> </execution> </executions> </plugin> </plugins>
- 在
plugin.yml里添加类路径配置:
classpath: - lib/jbcrypt-0.4.jar
打包后把插件Jar和lib目录一起放到Spigot的插件文件夹,Spigot会自动加载lib中的依赖。
总结
优先选方案1,几行配置就能搞定依赖打包,后续维护也省心。方案2虽然简单,但长期来看维护成本高。
内容的提问来源于stack exchange,提问作者Mikachu
相关产品推荐
相关产品推荐

