部署JavaEE应用遇jasypt.StrongPasswordEncryptor类未找到异常求助
问题
基于WildFly-26.1.0.Final服务器搭建JavaEE应用,使用jasypt库实现密码加密功能,但启动服务器时抛出org.jasypt.util.password.StrongPasswordEncryptor类未找到异常及相关错误。服务器输出日志如下:
18:51:59,300 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.subunit."ProyectoServidor.ear"."ProyectoEJB-ejb.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."ProyectoServidor.ear"."ProyectoEJB-ejb.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of subdeployment "ProyectoEJB-ejb.jar" of deployment "ProyectoServidor.ear" at org.jboss.as.server@18.1.0.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:189) at org.jboss.msc@1.4.13.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739) at org.jboss.msc@1.4.13.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1701) at org.jboss.msc@1.4.13.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559) at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.RuntimeException: WFLYSRV0177: Error getting reflective information for class com.fannog.proyectoservidor.utils.Encryptor with ClassLoader ModuleClassLoader for Module "deployment.ProyectoServidor.ear.ProyectoEJB-ejb.jar" from Service Module Loader at org.jboss.as.server@18.1.0.Final//org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:78) at org.jboss.as.server@18.1.0.Final//org.jboss.as.server.deployment.reflect.ClassReflectionIndexUtil.findMethod(ClassReflectionIndexUtil.java:57) at org.jboss.as.ejb3@26.1.0.Final//org.jboss.as.ejb3.deployment.processors.dd.DeploymentDescriptorMethodProcessor.handleStatelessSessionBean(DeploymentDescriptorMethodProcessor.java:99) at org.jboss.as.ejb3@26.1.0.Final//org.jboss.as.ejb3.deployment.processors.dd.DeploymentDescriptorMethodProcessor.deploy(DeploymentDescriptorMethodProcessor.java:76) at org.jboss.as.server@18.1.0.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:182) ... 8 more Caused by: java.lang.NoClassDefFoundError: org/jasypt/util/password/StrongPasswordEncryptor at java.base/java.lang.Class.getDeclaredFields0(Native Method) at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3297) at java.base/java.lang.Class.getDeclaredFields(Class.java:2371) at org.jboss.as.server@18.1.0.Final//org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:72) at org.jboss.as.server@18.1.0.Final//org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70) ... 12 more Caused by: java.lang.ClassNotFoundException: org.jasypt.util.password.StrongPasswordEncryptor from [Module "deployment.ProyectoServidor.ear.ProyectoEJB-ejb.jar" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:200) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) ... 17 more
异常原因
核心原因是WildFly的模块类加载器无法找到jasypt库中的StrongPasswordEncryptor类,具体分为以下几种场景:
- 项目打包时未将jasypt的jar包包含到部署单元中:比如EJB模块(
ProyectoEJB-ejb.jar)或EAR的共享lib目录里没有jasypt的jar,导致部署时模块类加载器找不到该类。 - 依赖配置错误:如果使用Maven/Gradle构建,jasypt依赖的
scope被设置为provided,但WildFly默认不自带jasypt库,导致打包时未将jar包纳入部署包。 - 手动部署jasypt到WildFly模块时配置错误:若尝试将jasypt作为服务器全局模块,未正确创建模块目录、配置
module.xml,或未在部署描述符中声明依赖,导致类加载失败。
解决建议
针对不同场景,可采取以下解决方案:
1. 修正项目依赖与打包配置
如果使用Maven,确保jasypt依赖的scope为compile(默认值,无需显式声明),这样打包时会将jar包包含到部署单元中:
<dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt</artifactId> <version>1.9.3</version> <!-- 替换为你项目中对应的版本 --> </dependency>
对于EAR项目,确保jasypt.jar被打包到EAR的lib目录下,这样所有子模块(EJB、Web等)都能共享加载该库;如果是单独的EJB模块,需将jasypt.jar放入EJB模块的lib目录(或Web模块的WEB-INF/lib)。
2. 将jasypt配置为WildFly全局模块
若希望整个WildFly服务器共享jasypt库,可按以下步骤操作:
- 在WildFly安装目录下创建模块目录:
${JBOSS_HOME}/modules/org/jasypt/main - 将jasypt.jar放入该目录
- 在该目录下创建
module.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.3" name="org.jasypt"> <resources> <resource-root path="jasypt-1.9.3.jar"/> <!-- 替换为你的jar文件名 --> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
- 在项目的
jboss-deployment-structure.xml中声明对该模块的依赖(若没有该文件,可在EAR或EJB模块的META-INF目录下创建):
<jboss-deployment-structure> <deployment> <dependencies> <module name="org.jasypt" export="true"/> </dependencies> </deployment> </jboss-deployment-structure>
内容的提问来源于stack exchange,提问作者Facundo Suarez
相关产品推荐
相关产品推荐

