我正在尝试升级我的 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