SpringBoot 2.2.6-RELEASE与jasypt-spring-boot-starter 3.0.2兼容问题求助
问题分析与解决方案
我刚帮你排查了这个问题,核心原因是外部Tomcat部署场景下,Jasypt 3.0.2与Spring Boot 2.2.6.RELEASE版本不兼容,再加上配置加载顺序问题,导致加密的数据源配置还没被解密,Spring就尝试初始化数据源,最终抛出"无法确定合适的驱动类"的错误——这其实是表象,本质是数据源的URL/用户名/密码未被正确解析。
下面是具体的解决步骤:
1. 降级Jasypt版本适配Spring Boot 2.2.x
Jasypt 3.0.x系列是为Spring Boot 3.x设计的,和Spring Boot 2.x存在兼容性问题。你需要把jasypt-spring-boot-starter的版本替换为2.1.x,这个版本完美适配Spring Boot 2.2.x:
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.2</version> <!-- 替换为这个版本 --> </dependency>
2. 确保bootstrap.yml在外部Tomcat中被加载
外部Tomcat部署时,Spring Boot默认不会自动加载bootstrap.yml,而你把Jasypt的加密密钥配置在这个文件里,会导致解密逻辑无法获取密钥。解决方法二选一:
- 方案A:把Jasypt的配置从
bootstrap.yml移到application-common.yml中,这样Spring启动时能正常读取到加密密钥:# application-common.yml中添加 jasypt: encryptor: password: alvin@20200418 algorithm: PBEWithMD5AndDES - 方案B:保留bootstrap.yml,但确保
spring-cloud-context依赖版本和Spring Boot匹配(你的2.2.2.RELEASE是对的),同时在启动类上添加@EnableConfigurable注解,强制加载bootstrap配置。
3. 重新生成加密的用户名/密码
因为Jasypt 2.x和3.x的加密逻辑有差异,你之前用3.0.2生成的加密串在2.1.2版本下无法正确解密。请用2.1.2版本的Jasypt重新生成加密内容:
# 下载jasypt-2.1.2.jar后执行命令 java -cp jasypt-2.1.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="你的数据库用户名" password=alvin@20200418 algorithm=PBEWithMD5AndDES java -cp jasypt-2.1.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="你的数据库密码" password=alvin@20200418 algorithm=PBEWithMD5AndDES
把生成的新加密串替换掉application-dev.yml里的ENC(...)内容。
4. 可选:通过Tomcat启动参数传递加密密钥(更安全)
为了避免把密钥写在配置文件里,你可以通过Tomcat的启动参数传递Jasypt密钥:
- Windows环境:修改
Tomcat/bin/catalina.bat,添加一行:set JAVA_OPTS=%JAVA_OPTS% -Djasypt.encryptor.password=alvin@20200418 - Linux环境:修改
Tomcat/bin/catalina.sh,添加一行:
这样就可以把配置文件里的export JAVA_OPTS="$JAVA_OPTS -Djasypt.encryptor.password=alvin@20200418"jasypt.encryptor.password删掉了。
验证步骤
- 执行
mvn clean package重新打包war包 - 替换Tomcat/webapps下的旧war包
- 启动Tomcat,查看日志是否正常初始化数据源
内容的提问来源于stack exchange,提问作者AlvinYueChao




