我有一个 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/