我有一个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文件吗?
非常感谢任何提示或建议。提前谢谢了。
答案 0 :(得分:1)
访问系统属性文件需要权限,并且您的代码显然在未授予权限的沙箱中运行。你需要
修改沙箱安全规则以允许访问该文件,
添加您可以调用的特定API以传递“agent.properties”文件内容,或
找到一些其他方法来获取代码的属性,完全不涉及读取文件。
最后一个例子,可以将文件中的属性作为命令行参数传递,或者将文件放入JAR文件中,以便您可以将其作为资源读取(模块化安全沙箱也不会阻止它。)
但必须要说的是,JAR文件有些奇怪,它不会让你在自己的机器上读取文件。它为什么这样做?这是一项关于安全管理人员,权限等的家庭作业吗?
答案 1 :(得分:1)
您可以将文件“agent.properties”放入jar中,然后通过getResourceAsStream访问它。由于我不详细了解您的沙箱中的安全策略,因此可能与权限有关。