AccessControlException:拒绝访问 - 调用者函数无法加载属性文件

时间:2010-04-10 05:08:08

标签: java

我有一个jar存档环境,它会在我这样的文件夹中调用我的类:

java -jar "emarket.jar" ../tournament 100

我的编译类已部署到../tournament文件夹中,此命令运行良好。

在我更改代码以加载属性文件后,它会收到以下异常消息:

Exception in thread "main" java.security.AccessControlException: access denied (java.io.FilePermission agent.properties 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.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at Agent10479475.getPropertiesFromConfigFile(Agent10479475.java:110)
at Agent10479475.<init>(Agent10479475.java:100)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at emarket.client.EmarketSandbox.instantiateClientObjects(EmarketSandbox.java:92)
at emarket.client.EmarketSandbox.<init>(EmarketSandbox.java:27)
at emarket.client.EmarketSandbox.main(EmarketSandbox.java:166)

我想知道为什么这种安全检查会失败。我在我的类的默认构造函数中发出getPropertitiesFromConfigFile()函数,如下所示:

public class Agent10479475 extends AbstractClientAgent
{
    //default constructor
    public Agent10479475()
    {
        //set all properties to their default values in constructor
        FT_THRESHOLD                        = 400;
        FT_THRESHOLD_MARGIN                 = 50;

        printOut("Now loading properties from a config file...", "");
        getPropertiesFromConfigFile();
        printOut("Finished loading","");
        }

    private void getPropertiesFromConfigFile()
    {
        Properties props = new Properties();

        try
        {
            props.load(new FileInputStream("agent.properties"));
            FT_THRESHOLD            = Long.parseLong(props.getProperty("FT_THRESHOLD"));
            FT_THRESHOLD_MARGIN         = Long.parseLong(props.getProperty("FT_THRESHOLD_MARGIN "));
        }
        catch(java.io.FileNotFoundException fnfex)
        {
            printOut("CANNOT FIND PROPERTIES FILE :", fnfex);
        }
        catch(java.io.IOException ioex)
        {
            printOut("IOEXCEPTION OCCURED :", ioex);
        }
    }

}

我的类正在同一文件夹下加载自己的.properties文件。为什么Java环境会抱怨这种拒绝访问? 我必须配置emarket.client.EmarketSandbox类,它不是由我编写并存储在emarket.jar中,以访问我的agent.properties文件吗?

非常感谢任何提示或建议。提前谢谢了。

2 个答案:

答案 0 :(得分:1)

访问系统属性文件需要权限,并且您的代码显然在未授予权限的沙箱中运行。你需要

  • 修改沙箱安全规则以允许访问该文件,

  • 添加您可以调用的特定API以传递“agent.properties”文件内容,或

  • 找到一些其他方法来获取代码的属性,完全不涉及读取文件。

最后一个例子,可以将文件中的属性作为命令行参数传递,或者将文件放入JAR文件中,以便您可以将其作为资源读取(模块化安全沙箱也不会阻止它。)

但必须要说的是,JAR文件有些奇怪,它不会让你在自己的机器上读取文件。它为什么这样做?这是一项关于安全管理人员,权限等的家庭作业吗?

答案 1 :(得分:1)

您可以将文件“agent.properties”放入jar中,然后通过getResourceAsStream访问它。由于我不详细了解您的沙箱中的安全策略,因此可能与权限有关。