javac编译Java报错:org.springframework.security.crypto.bcrypt包不存在
问题描述
我尝试编译以下Java代码:
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import java.security.SecureRandom; public class BCrypt { public static void main(String[] args) { int strength = 10; BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(strength, new SecureRandom()); System.out.println(bCryptPasswordEncoder.encode(args[0])); } }
使用如下命令执行编译:
javac -cp spring-security-crypto-5.5.1.jar BCrypt.java
执行后得到如下报错:
BCrypt.java:1: error: package org.springframework.security.crypto.bcrypt does not exist
当前使用的Java环境信息:
openjdk version "11.0.12" 2021-07-20 OpenJDK Runtime Environment
Temurin-11.0.12+7 (build 11.0.12+7) OpenJDK 64-Bit Server VM
Temurin-11.0.12+7 (build 11.0.12+7, mixed mode)
问题原因
报错核心原因是编译时classpath仅引入了spring-security-crypto-5.5.1.jar,但该模块存在强制传递依赖:Spring Security加密模块必须依赖Spring核心包spring-core才能正常工作,单独引入crypto包时JVM无法加载关联类,就会抛出包不存在的错误。
修复方法
手动引入依赖方式
- 下载与当前Spring Security版本匹配的
spring-corejar包:5.5.x系列Spring Security配套兼容5.3.x系列Spring Core,选择spring-core-5.3.12.jar即可,将该jar与已有的spring-security-crypto-5.5.1.jar、BCrypt.java放在同一目录。 - 编译时将所有依赖加入classpath,注意不同操作系统classpath分隔符有区别:
- Linux/macOS用冒号
:分隔路径,执行编译命令:javac -cp "spring-security-crypto-5.5.1.jar:spring-core-5.3.12.jar" BCrypt.java - Windows用分号
;分隔路径,执行编译命令:javac -cp "spring-security-crypto-5.5.1.jar;spring-core-5.3.12.jar" BCrypt.java
- Linux/macOS用冒号
- 运行时需要将当前目录(
.,代表编译生成的BCrypt.class所在路径)和所有依赖jar都加入classpath,否则会触发运行时类找不到错误:- Linux/macOS运行命令:
java -cp ".:spring-security-crypto-5.5.1.jar:spring-core-5.3.12.jar" BCrypt 待加密明文 - Windows运行命令:
java -cp ".;spring-security-crypto-5.5.1.jar;spring-core-5.3.12.jar" BCrypt 待加密明文
- Linux/macOS运行命令:
构建工具自动管理依赖方式(推荐)
如果不想手动查找jar、处理传递依赖,直接用Maven或Gradle构建项目即可,仅需声明spring-security-crypto依赖,构建工具会自动拉取所有关联的传递依赖,从根源上避免缺包问题。
内容的提问来源于stack exchange,提问作者ekkis
相关产品推荐
相关产品推荐

