问题描述:
服务新增一个加解密模块后,本地调试OK部署到测试环境启动开始功能测试,却发现相关功能异常,查看服务日志发现以下异常
1 | java.security.NoSuchAlgorithmException: Algorithm HmacSHA256 not available |
问题排查:
服务是springboot的项目,直接打包成jar包,启动脚本中使用java -jar
的形式启动。由于用到了一些公司内部封装的依赖jar包,而这些jar必须外部加载不能打进jar里面启动,所以使用了-Djava.ext.dirs
去加载外部依赖jar包,这时一个陷阱就出现了,-Djava.ext.dirs
会覆盖掉java本身的ext设置,java.ext.dirs
指定的目录由ExtClassLoader加载器加载,如果没有指定该系统属性,那么该加载器默认加载$JAVA_HOME/jre/lib/ext
目录下的所有jar文件
1 | -rwxr-xr-x 1 3860502 Mar 15 2017 cldrdata.jar |
所以,只单单指定了额外依赖的jar包后,就会导致ext目录下的jar包无法加载,而这次我们新增的加解密模块使用了HmacSHA256
算法,依赖于sunjce_provider.jar
包的内容,当我们在本地环境调试时,直接IDEA启动,没有出现依赖加载错误的问题,而当在测试环境使用启动脚本启动并且指定了-Djava.ext.dirs
就导致了依赖出错。
问题解决:
问题已经找出,那么解决就很简单,-Djava.ext.dirs
引入多个路径加入Java自带ext路径即可
1 | java -Djava.ext.dirs=../lib:$JAVA_HOME/jre/lib/ext -jar |