Java JDK11,安全策略不’;无法传播到ForkJoinPool工作线程
在两个不同的JDK版本(8和11)上运行,VM参数为:-Djava.security.policy=C:\test\u system.policy 测试系统策略内容:Java JDK11,安全策略不’;无法传播到ForkJoinPool工作线程,java,rmi,java-11,fork-join,security-policy,Java,Rmi,Java 11,Fork Join,Security Policy,在两个不同的JDK版本(8和11)上运行,VM参数为:-Djava.security.policy=C:\test\u system.policy 测试系统策略内容: public class S3ButcketTest { public static void main(String args[]) { System.setSecurityManager(new RMISecurityManager()); ForkJoinPool pool = new ForkJoinPo
public class S3ButcketTest
{
public static void main(String args[])
{
System.setSecurityManager(new RMISecurityManager());
ForkJoinPool pool = new ForkJoinPool(1);
System.out.println("main: "+Policy.getPolicy());
pool.execute(new Runnable()
{
@Override
public void run()
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("pool: "+Policy.getPolicy());
}
});
pool.shutdown();
try
{
pool.awaitTermination(1000, TimeUnit.SECONDS);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
使用JDK11运行时的输出:
grant {
permission java.security.AllPermission;
};
使用JDK8运行时的输出:
main: sun.security.provider.PolicyFile@4cb2c100
Exception in thread "ForkJoinPool-1-worker-3" java.security.AccessControlException: access denied ("java.security.SecurityPermission" "getPolicy")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.base/java.security.AccessController.checkPermission(AccessController.java:895)
at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
at java.base/java.security.Policy.getPolicy(Policy.java:159)
at S3ButcketTest$1.run(S3ButcketTest.java:30)
at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
我们将JDK从8升级到11,突然间我们面临这个问题。为什么会发生这种情况,有什么解释吗?有解决方案吗?不是解决方案,但我正在调试一个类似的问题。在JDK 8中运行良好的测试在JDK 11中失败。存在拒绝访问错误,这表明线程根本没有任何权限。JDK8中有一个解释行为变化的例子。
main: sun.security.provider.PolicyFile@1b84c92
pool: sun.security.provider.PolicyFile@1b84c92