首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 9+中启动jstatd

在Java 9+中启动jstatd
EN

Stack Overflow用户
提问于 2018-06-25 21:35:15
回答 2查看 3.3K关注 0票数 18

在过去,我通过一个安全策略文件启动jstatd,如下所示:https://stackoverflow.com/a/14930180/1294116

但是,在Java9+中,它们已经删除了tools.jar文件,这意味着该解决方案不再有效。有人知道怎么绕过这件事吗?(目前,我又回到了错误java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") ...)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-25 23:18:08

解决方案

以下策略文件应该适用于您(至少在Java 11下):

代码语言:javascript
复制
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工具),则可以通过在策略文件中将jrt URL指定为codeBase值来授予映像中的应用程序和库模块的权限。有关JEP 220:模块化运行时映像 URL的更多信息,请参见jrt。 下面的示例授予将foo属性读取到模块com.greetings的权限: grant codeBase“jrt:/com.Hello”{ java.util.PropertyPermission "foo","read";};

来自JEP 200:模块化JDK

设计原则 JDK的模块化结构实现了以下原则:

  • 标准模块的规范由JCP控制,其名称以字符串"java."开头。
  • 所有其他模块都只是JDK的一部分,其名称以字符串"jdk."开头。

..。

来自JEP 220:模块化运行时映像

摘要 重组JDK和JRE运行时映像,以适应模块,并提高性能、安全性和可维护性。定义一个新的URI方案,用于命名存储在运行时映像中的模块、类和资源,而不显示映像的内部结构或格式。根据需要修改现有规范以适应这些变化。 ..。 删除: rt.jar和tools.jar 以前存储在lib/rt.jarlib/tools.jarlib/dt.jar和其他各种内部JAR文件中的类和资源文件现在以更高效的格式存储在lib目录中特定于实现的文件中。这些文件的格式未指定,如有更改,恕不另行通知。 删除rt.jar和类似的文件会导致三个截然不同的问题:

  1. ..。
  2. java.security.CodeSource API和安全策略文件使用URL来命名将被授予指定权限的代码基的位置。运行时系统中需要特定权限的组件目前通过文件URL在lib/security/java.policy文件中标识。例如,椭圆曲线密码提供程序被识别为 文件:${java.home}/lib/ext/sunec.jar

显然,在模组图像中没有任何意义。

  1. ..。

用于命名存储模块、类和资源的新URI方案()

为了解决上述三个问题,可以使用一个新的URL方案( jrt )来命名存储在运行时映像中的模块、类和资源,而不会显示图像的内部结构或格式。

jrt URL是按RFC 3986划分的层次化URI,其语法为

jrt:/[$模块/$PATH]

其中$MODULE是一个可选的模块名,$PATH (如果存在)是该模块中特定类或资源文件的路径。jrt网址的含义取决于其结构:

  • ..。
  • jrt:/$MODULE是指模块$MODULE中的所有类和资源文件。
  • ..。

这三种形式的jrt URL解决了上述问题,具体如下:

  1. ..。
  2. 安全性-策略文件和CodeSource API的其他用途可以使用jrt URL来命名特定的模块以授予权限。例如,椭圆曲线密码提供程序现在可以通过jrt URL识别。 jrt:/jdk.cryp.ec 其他模块目前已被授予所有权限,但实际上并不需要它们,这些模块可能会被取消特权,也就是说,给出它们所需的权限。
  3. ..。

JEP 200和JEP 220都是吉格锯工程的一部分。

票数 32
EN

Stack Overflow用户

发布于 2018-06-25 21:44:09

我找到了一个(有问题的)解决方案:

代码语言:javascript
复制
grant {
   permission java.security.AllPermission;
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51032095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档