java - JDK11,安全策略不会传播到 ForkJoinPool 工作线程
问题描述
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();
}
}
}
使用 VM 参数在两个不同的 JDK 版本(8 和 11)上运行:-Djava.security.policy=C:\test_system.policy
test_system.policy 内容:
grant {
permission java.security.AllPermission;
};
使用JDK11运行时的输出:
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)
使用JDK8运行时的输出:
main: sun.security.provider.PolicyFile@1b84c92
pool: sun.security.provider.PolicyFile@1b84c92
我们将 JDK 从 8 升级到 11,突然我们遇到了这个问题。有什么解释为什么会这样吗?有什么解决办法吗?
解决方案
推荐阅读
- javascript - 将一个值带入错误响应之外
- naming-conventions - 为互斥选项而不是真/假关系命名布尔变量
- python - 比较两个文本文件,在第三个文件中输出
- google-maps - ionic 3 中的原生地图不起作用
- javascript - 承诺然后在 thunk 调度中返回未定义?
- reactjs - 有没有办法将多个模块要求放入一个文件中,然后将其作为单个模块再次导出?
- oracle - 用于带有 JDK 8 的 IBM websphere 8.5.5.11 的 DB2 和 Oracle Sybace 驱动程序
- batch-file - 批处理文件 - 使用用户输入的文件名重命名复制的文件
- angular - 使用 Angular Material 核心主题的 Angular 应用程序中的字体在哪里加载?
- c# - 获取 DataPicker 值 MVVM