簡體   English   中英

AccessControlException:訪問被拒絕-調用者函數無法加載屬性文件

[英]AccessControlException: access denied - caller function failed to load properties file

我有一個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.jar中的emarket.client.EmarketSandbox類訪問我的agent.properties文件?

任何提示或建議,不勝感激。 提前謝謝了。

訪問 系統屬性 文件需要權限,並且您的代碼顯然在未授予權限的沙箱中運行。 你要么需要

  • 修改沙盒安全規則以允許訪問該文件,

  • 添加可以調用以傳遞“ agent.properties”文件內容的特定API,或者

  • 尋找一些其他方法來獲取代碼的屬性,而這些方法根本不需要讀取文件。

最后一個示例可能會將文件中的屬性作為命令行參數傳遞,或將文件放入JAR文件中,以便您可以將其作為資源讀取(對安全沙箱進行模化也不會阻止該文件)。

但是必須說,關於JAR文件有些奇怪,不能讓您在自己的計算機上讀取文件。 為什么這樣做呢? 這是關於安全管理器,權限等的家庭作業嗎?

您可以將文件“ agent.properties”放入jar中,並通過getResourceAsStream訪問它。 由於我不了解您的沙箱中的安全策略的詳細信息,因此無論該權限是否有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM