繁体   English   中英

在 Java 9+ 中启动 jstatd

[英]Starting jstatd in Java 9+

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

但是,在 Java 9+ 中,他们删除了tools.jar文件,这意味着该解决方案不再有效。 有谁知道如何解决这个问题? (目前我又回到了错误java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") ...

解决方案

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

grant codebase "jrt:/jdk.jstatd" {    
   permission java.security.AllPermission;    
};

grant codebase "jrt:/jdk.internal.jvmstat" {    
   permission java.security.AllPermission;    
};

感谢Sebastian S指出jdk.internal.jvmstat也需要被授予适当的权限并确认上述工作。 后者也感谢Gili

如下所示, tools.jar文件被删除,其中的所有内容都被拆分为模块。 jstatd工具现在位于jdk.jstatd模块中。 我找不到有关如何确定哪个工具进入哪个模块的文档,尽管Javadoc会事后告诉您。 请注意,某些模块包含单个工具的代码,而其他模块包含多个工具的代码。


文档

策略文件语法文档:

如果您使用的是模块化运行时映像(请参阅jlink工具),您可以通过将jrt URL 指定为策略文件中的codeBase值来授予对映像中的应用程序和库模块的权限。 有关jrt URL 的更多信息,请参阅JEP 220:模块化运行时图像

以下示例授予模块com.greetings读取foo属性的com.greetings

 grant codeBase "jrt:/com.greetings" { permission java.util.PropertyPermission "foo", "read"; };

来自JEP 200:模块化 JDK

设计原则

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

  • 标准模块的规范由 JCP 管理,其名称以字符串"java."开头"java." .
  • 所有其他模块只是 JDK 的一部分,名称以字符串"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文件中标识。 椭圆曲线密码提供者,例如,被标识为

    file:${java.home}/lib/ext/sunec.jar

    显然,这在模块化图像中没有意义。

  3. [...]

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

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

jrt URL 是一个分层 URI,符合 RFC 3986,语法为

jrt:/[$MODULE[/$PATH]]

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

  • [...]

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

  • [...]

这三种形式的jrt URL分别解决了上述问题:

  1. [...]

  2. 安全策略文件和CodeSource API 的其他用途可以使用jrt URL 来命名特定模块以授予权限。 椭圆曲线加密提供者,例如,现在可以通过jrt URL 识别

    jrt:/jdk.crypto.ec

    当前被授予所有权限但实际上并不需要它们的其他模块可以简单地取消特权,即,精确地给予它们需要的权限。

  3. [...]

JEP 200JEP 220都是Jigsaw 项目的一部分。

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

grant {
   permission java.security.AllPermission;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM