在过去,我通过一个安全策略文件启动jstatd,如下所示:https://stackoverflow.com/a/14930180/1294116
但是,在Java9+中,它们已经删除了tools.jar文件,这意味着该解决方案不再有效。有人知道怎么绕过这件事吗?(目前,我又回到了错误java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") ...)
发布于 2018-06-25 23:18:08
解决方案
以下策略文件应该适用于您(至少在Java 11下):
grant codebase "jrt:/jdk.jstatd" {
permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {
permission java.security.AllPermission;
};感谢塞巴斯蒂安S的指出,jdk.internal.jvmstat也需要得到适当的许可和确认上述工作。感谢吉里对后者的支持。
如下图所示,tools.jar文件被删除,其中的所有内容都被分割成模块。jstatd工具现在驻留在jdk.jstatd模块中。我无法找到关于如何确定哪个工具进入哪个模块的文档,尽管Javadoc在事后告诉您。只需注意,某些模块包含单个工具的代码,而其他模块包含多个工具的代码。
文档
来自策略文件语法文档:
如果使用模块化运行时映像(请参阅
jlink工具),则可以通过在策略文件中将jrtURL指定为codeBase值来授予映像中的应用程序和库模块的权限。有关JEP 220:模块化运行时映像 URL的更多信息,请参见jrt。 下面的示例授予将foo属性读取到模块com.greetings的权限: grant codeBase“jrt:/com.Hello”{ java.util.PropertyPermission "foo","read";};
设计原则 JDK的模块化结构实现了以下原则:
"java."开头。"jdk."开头。..。
摘要 重组JDK和JRE运行时映像,以适应模块,并提高性能、安全性和可维护性。定义一个新的URI方案,用于命名存储在运行时映像中的模块、类和资源,而不显示映像的内部结构或格式。根据需要修改现有规范以适应这些变化。 ..。 删除: rt.jar和tools.jar 以前存储在
lib/rt.jar、lib/tools.jar、lib/dt.jar和其他各种内部JAR文件中的类和资源文件现在以更高效的格式存储在lib目录中特定于实现的文件中。这些文件的格式未指定,如有更改,恕不另行通知。 删除rt.jar和类似的文件会导致三个截然不同的问题:
java.security.CodeSource API和安全策略文件使用URL来命名将被授予指定权限的代码基的位置。运行时系统中需要特定权限的组件目前通过文件URL在lib/security/java.policy文件中标识。例如,椭圆曲线密码提供程序被识别为
文件:${java.home}/lib/ext/sunec.jar显然,在模组图像中没有任何意义。
用于命名存储模块、类和资源的新URI方案()
为了解决上述三个问题,可以使用一个新的URL方案( jrt )来命名存储在运行时映像中的模块、类和资源,而不会显示图像的内部结构或格式。
jrt URL是按RFC 3986划分的层次化URI,其语法为
jrt:/[$模块/$PATH]
其中$MODULE是一个可选的模块名,$PATH (如果存在)是该模块中特定类或资源文件的路径。jrt网址的含义取决于其结构:
jrt:/$MODULE是指模块$MODULE中的所有类和资源文件。这三种形式的jrt URL解决了上述问题,具体如下:
CodeSource API的其他用途可以使用jrt URL来命名特定的模块以授予权限。例如,椭圆曲线密码提供程序现在可以通过jrt URL识别。
jrt:/jdk.cryp.ec
其他模块目前已被授予所有权限,但实际上并不需要它们,这些模块可能会被取消特权,也就是说,给出它们所需的权限。JEP 200和JEP 220都是吉格锯工程的一部分。
发布于 2018-06-25 21:44:09
我找到了一个(有问题的)解决方案:
grant {
permission java.security.AllPermission;
};https://stackoverflow.com/questions/51032095
复制相似问题