java - 访问控制异常 : access denied - caller function failed to load properties file

标签 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 文件?

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

最佳答案

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

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

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

  • 找到一些其他方法来获取代码的属性,而根本不需要读取文件。

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

但是必须要说的是,JAR 文件有一些奇怪的地方,它不允许您在自己的计算机上读取文件。它为什么要这样做?这是关于安全管理器、权限等的家庭作业吗?

关于java - 访问控制异常 : access denied - caller function failed to load properties file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2612325/

相关文章:

java - 从内联覆盖方法访问实例

java - String类和用户定义类的.equals方法

java - 为什么成员对象在父类(super class)的构造函数之后初始化?

java,在java代码中执行WAR中的exe

java - 在http :xalan:jar:2. eviware.com/repository/maven2/中找不到org.apache.xalan ://www. 7.1

java - 信号量同步 wait() 和 notify()

java.lang.IllegalThreadStateException : Thread already started while there is only 1 thread 异常

java - StringBuilder 与 StringBuffer

java - 使用 Prism.js 在 WebView 中显示 HTML

java - (java) HttpEntity.getContent() 输出有限的 InputStream (8192b/7748b) ...我正在尝试下载 2.4MB 文件