Skip to main content
 首页 » 编程设计

java之Open JDK 11 上的 SpringBoot之SecurityManager 处于 Activity 状态时出现 'ClassNotFound' 错误

2023年09月11日68tintown

我正在尝试升级我的 Spring Boot 项目以使用 Java 11, 我正在将项目编译成一个 jar 并尝试运行它:

java -jar ./myApp.jar 

运行时,我开始收到如下错误:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/home/user/dev/my-app/target/my-app.jar!/BOOT-INF/classes!/com/user/myapp/encryption/EnableEncryptedProps.class]; 

完整的堆栈跟踪在这里:https://pastebin.com/LZmVgwXS

考虑到这一点,当我启动我的应用程序时,我将启用默认的 SecurityManager。 当我不这样做时,该应用程序工作正常 - 但我想解决实际问题并正确修复它而不删除 SecurityManager。

这就是我启动我的应用程序的方式:

public static void main(String[] args) { 
    System.setSecurityManager(new SecurityManager()); // When this line is removed - all is working fine 
    SpringApplication.run(Initializer.class, args); 
} 

请您参考如下方法:

作为 this Spring Boot issue 的一部分,我一直在对此进行调查.这似乎是由 JDK 中较差的诊断和异常处理以及 Spring Boot 中的错误共同引起的。

启用安全管理器后,JDK 会执行一些额外的 jar 检查。在尝试加载类文件期间,此 jar 检查失败并出现 NullPointerException。不幸的是,异常被吞没了,因此导致的症状是无法加载一个类,但没有指示为什么无法加载它。

Spring Boot 中的错误首先导致变量为 null。 在问题得到解决之前,您可以通过使用系统属性禁用额外的 jar 检查来解决该问题:

-Dsun.misc.URLClassPath.disableJarChecking=true