使用logback的java.security.policy问题

时间:2011-11-04 21:21:50

标签: java slf4j logback

以下代码使用LOG4J(和SLF4J)运行文件:

package test; 

import java.rmi.RMISecurityManager; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

    public class TestMain { 
    private static final Logger logger = LoggerFactory.getLogger(TestMain.class); 
    public static void main(String[] args) throws Exception { 
        System.setProperty("java.security.policy", "./src/main/config/java.policy"); 
        logger.debug("Policy location: {}", System.getProperty("java.security.policy")); 
        if (System.getSecurityManager() == null) { 
            System.setSecurityManager(new RMISecurityManager()); 
        } 
        System.setProperty("java.security.policy", "./src/main/config/java.policy"); 
    } 
}

将依赖项切换为“logback”而不是log4j时,它会给出:

01:05:37.702 [main] DEBUG test.TestMain - Policy location: ./src/main/config/java.policy 
Exception in thread "main" java.security.AccessControlException: access denied (java.util.PropertyPermission java.security.policy write) 
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) 
at java.security.AccessController.checkPermission(AccessController.java:546) 
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
at java.lang.System.setProperty(System.java:725) 
at test.TestMain.main(TestMain.java:18) 

在主要方法的最后一行。

java.policy文件的内容:

grant { 
    permission java.security.AllPermission; 
}; 

将java.policy文件放在“$ JAVA_HOME / jre / lib / security”中解决了这个问题。

任何人都可以告诉我发生了什么事?

1 个答案:

答案 0 :(得分:1)

我发现我们有3种方法可以解决这个问题:

1)在初始化记录器之前初始化SecurityManager 2)用你的$替换$ JAVA_HOME / jre / lib / security中的java.policy 3)启动应用程序时将java.policy的位置作为系统属性传递:-Djava.security.policy = java.policy