我正在将一个项目从Java-8和Sping Boot 2.x迁移到Java 17和Spring Boot 3.x。该项目使用Security Manager满足一些内部需求,目前无法删除。当项目开始使用intellij时,即java -classpath <all local classes>;<all dependencies> <main class>
它工作得很好,但如果使用最终的可执行jar,那么会出现很多找不到类的异常,比如logger、ignite等。此外,如果安全管理器关闭,则不会出现错误java -jar <executable jar>
用于启用自定义安全管理器的代码
log.warn("Enabling PlatformSecurityManager");
Policy policy = Policy.getPolicy();
PermissionCollection perm = policy.getPermissions(new CodeSource(null, (Certificate[]) null));
boolean canReplaceSecurityManager = perm.implies(new RuntimePermission("setSecurityManager"));
if (System.getSecurityManager() != null && !canReplaceSecurityManager) {
//we have to do the check like this because it will be from a different classloader
if (!(System.getSecurityManager().getClass().getName().equals(PlatformSecurityManager.class.getName()))) {
throw new RuntimeException(
"You have started the JVM with a security manager that doesn't allow me to set a new one!");
}
//else another platform application has specified the security manager... so we should be ok
} else {
if (System.getProperty("java.security.policy") == null) {
log.warn("java.security.policy Not found");
//load up allow all policy
log.info("Enabling AllPermission for the platform security manager");
PlatformSecurityPolicy platformPolicy = new PlatformSecurityPolicy();
platformPolicy.addPermission(new AllPermission());
Policy.setPolicy(platformPolicy);
}
log.warn("Enabled PlatformSecurityManager");
System.setSecurityManager(new PlatformSecurityManager(false));
}
如果需要任何其他信息,请添加注解。任何领导/帮助都非常感谢。
1条答案
按热度按时间fzsnzjdm1#
根据下面的文章,这是Java 11 +的Sping Boot 中的一个错误,虽然他们已经修复了它是Spring 2.3+,但同样没有前端移植到3.x,所以在应用下面的解决方案后,它对我有效
-Dsun.misc.URLClassPath.disableJarChecking=true
参考文献
https://github.com/spring-projects/spring-boot/issues/25538