带有SecurityManager策略文件的Java Shipping JAR
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有SecurityManager策略文件的Java Shipping JAR相关的知识,希望对你有一定的参考价值。
我正在尝试发布一个执行一些RMI调用的Java应用程序。
我需要将它作为一个JAR文件发送(这是一个要求,没有办法解决它)。
现在,为了允许某些东西(比如套接字和RMI连接),我需要一个SecurityManager和一个Policy文件。
我想在jar中发送此策略文件,并从JAR内部设置策略路径。
现在,这就是我的代码:
public static void main(String[] args)
{
System.setProperty("java.security.policy","jar:file:/Policies/Server.policy");
Policy.getPolicy().refresh();
... /* All other code */
}
当我将路径更改为我的PC上的路径并运行没有JAR的代码(一个IntelliJ'应用程序')时,启动我的应用程序没有问题,当我尝试运行我的JAR时,我得到以下异常:
Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:2000" "listen,resolve")
我有一种感觉,我设置的路径是错误的,任何人都可以告诉我这条路应该是什么?
答案
通过将我的代码更改为以下内容,我能够解决此问题:
public static void main(String[] args)
{
boolean quit = false;
String serverPolicyPath = "/Policies/Server.policy";
URL serverPolicyURL = Main.class.getResource(serverPolicyPath);
if (serverPolicyURL == null)
{
System.err.println("getResource returned NULL");
return;
}
System.setProperty("java.security.policy",serverPolicyURL.toString());
Policy.getPolicy().refresh();
...
我没有试图手动找出路径,而是让Java为我修复它。
以上是关于带有SecurityManager策略文件的Java Shipping JAR的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 Java SecurityManager 以允许从给定文件中读取所有属性
带有 SecurityManager 的 Constructor.newInstance 与 Class.newInstance