使用6.21版libvibesimplejava.so加解密报NoClassDefFoundError如何解决
问题原因
- 最核心的原因是你使用了
system范围的Maven依赖,默认情况下Maven不会将systemscope的依赖打包到最终的可执行jar/war或者部署的classpath中,开发实例运行时类路径下缺少vibesimplejava.jar,因此无法找到对应的VeException类。 - 其次可能存在
vibesimplejava.jar包本身不完整的问题,缺失了com.voltage.securedata.enterprise.VeException类定义。 - 部分开发实例的运行环境会自定义类加载器路径,不会主动读取你本地配置的
systemPath路径下的jar包。
解决思路
- 【推荐】移除
system依赖配置,将vibesimplejava.jar安装到本地Maven仓库或团队私有Maven仓库,使用普通依赖方式引用:
执行如下Maven命令安装jar到本地仓库:
之后修改pom依赖配置,删除mvn install:install-file -Dfile=${basedir}/src/main/resources/****/lib/vibesimplejava.jar -DgroupId=vibesimplejava -DartifactId=vibesimplejava -Dversion=6.21.0.0 -Dpackaging=jar<scope>system</scope>和<systemPath>标签即可,Maven会自动将该依赖纳入部署的classpath中。 - 若必须保留
systemscope配置,修改打包插件配置将系统范围依赖包含到部署包中:
以Spring Boot打包插件为例,增加includeSystemScope配置:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> - 验证jar包完整性,执行如下命令确认jar包中存在目标类:
若无输出则说明jar包损坏或版本不匹配,需重新获取对应6.21版本的完整官方jar包。jar tf vibesimplejava.jar | grep "com/voltage/securedata/enterprise/VeException" - 排查开发实例类加载情况,在实例启动参数中增加
-verbose:class,运行时查看日志确认vibesimplejava.jar是否被正常加载,若未加载则手动将jar包路径添加到实例的运行classpath参数中。 - 顺便优化so库加载逻辑:不要写死相对路径加载so文件,改为
System.loadLibrary("vibesimplejava"),同时在开发实例启动参数中增加-Djava.library.path=so文件所在目录路径,避免后续出现native库加载失败问题。
内容的提问来源于stack exchange,提问作者user17369534
相关产品推荐
相关产品推荐

