Java 8迁移至Java 11登录失败:找不到PublicAuthenticatorLoginModule
解决方案:找不到LoginModule的排查与修复
1. 核对JAAS配置文件
- 确认登录配置文件(如
jaas.conf)中指定的LoginModule类名完全匹配newco.connectivity.PublicAuthenticatorLoginModule,注意包名、类名的大小写和拼写 - 确保配置文件被正确加载:如果是通过系统属性指定(如
-Djava.security.auth.login.config=path/to/jaas.conf),检查路径是否正确,打包后该文件是否在应用的资源目录中能被访问到
2. 检查install4j的类路径配置
- 在install4j项目的「JVM Options」中,确认
connectivity.jar已被添加到类路径参数(-classpath或-cp)中,或者在「Application Files」中已将该Jar包含到分发包中 - 重新创建JRE Bundle时,检查是否勾选了必要的依赖项,或者确认install4j在打包时没有遗漏
connectivity.jar
3. 适配Java 11的模块化特性
- 如果你的应用是模块化项目(包含
module-info.java):- 在模块声明中添加对JAAS模块的依赖:
requires java.security.auth; - 导出LoginModule所在的包:
exports newco.connectivity;,或者使用JVM参数--add-exports newco.connectivity/newco.connectivity=java.security.auth来允许JAAS模块访问自定义LoginModule
- 在模块声明中添加对JAAS模块的依赖:
- 如果是非模块化应用,确保JVM参数中没有启用
--module-path强制模块化,或者将connectivity.jar放在类路径下而非模块路径中
4. 调试类加载过程
- 添加JVM参数
-verbose:class启动应用,查看控制台输出中newco.connectivity.PublicAuthenticatorLoginModule的加载记录,确认该类是否被成功加载,以及加载的来源Jar是否为预期的connectivity.jar - 排查类加载器隔离问题:JAAS的
LoginContext默认使用系统类加载器,如果你的LoginModule是由自定义类加载器加载的,可能需要在创建LoginContext时显式指定类加载器:LoginContext lc = new LoginContext("LoginConfigName", subject, callbackHandler, loginConfig, customClassLoader);
内容的提问来源于stack exchange,提问作者Shivom
相关产品推荐
相关产品推荐

