Java 安全管理器

3
grant {
     permission java.io.FilePermission "C:\\class\\*", "read, write";
     permission java.lang.RuntimePermission "createClassLoader";
};

我的policy.txt

java.security.AccessControlException: access denied (java.io.FilePermission c:\class read)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkRead(Unknown Source)
    at java.io.File.isDirectory(Unknown Source)
    at java.io.File.toURI(Unknown Source)
    at loader.Main.main(Main.java:35)

我的异常..???

我的调用

String path = "c:\\class\\";
String app = "x.MyHTMLPrint";


File file = new File(path);
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};

ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass(app);

只要我给它完全的权限,它就能正常工作。有什么想法吗?谢谢!

4
虽然我不太熟悉那个策略文件,但是看起来你的意思是可以阅读 C:\class 目录下的所有内容,但是试图访问 C:\class 这个目录本身会有问题。 - Yishai
你是如何准确地调用你的程序的? - ankon
1个回答

8

这里似乎有两个问题。

首先,正如Yishai所说,File.toURI似乎需要检查不带尾部分隔符的文件是否为目录。这可能是一个错误。

其次,递归子目录的通配符是“-”,而不是“*”。

因此,您的策略文件应该像这样:

grant {
    permission java.io.FilePermission "C:\\class\\-", "read";
    permission java.io.FilePermission "C:\\class", "read";
    permission java.lang.RuntimePermission "createClassLoader";
};

此外,如果您使用URLClassLoader.newInstance,您不需要createClassLoader权限,并且您将获得一个已完成的类加载器实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接