在 Java 9+ 中启动 jstatd溶液文档

2022-09-02 20:26:49

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

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


答案 1

溶液

以下策略文件应该适合您(至少在 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

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


文档

策略文件语法文档中:

如果使用的是模块化运行时映像(请参阅该工具),则可以通过将 URL 指定为策略文件中的值来向映像中的应用程序和库模块授予权限。有关 URL 的详细信息,请参阅 JEP 220:模块化运行时映像jlinkjrtcodeBasejrt

下面的示例授予读取模块属性的权限:foocom.greetings

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

来自 JEP 200:模块化 JDK

设计原则

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

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

[...]

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

总结

重构 JDK 和 JRE 运行时映像,以适应模块并提高性能、安全性和可维护性。定义新的 URI 方案,用于命名存储在运行时映像中的模块、类和资源,而不会泄露映像的内部结构或格式。根据需要修改现有规范以适应这些更改。

[...]

已删除:rt.jar和工具.jar

以前存储在 、 、 和 各种其他内部 JAR 文件中的类和资源文件现在以更有效的格式存储在目录中特定于实现的文件中。这些文件的格式未指定,如有更改,恕不另行通知。lib/rt.jarlib/tools.jarlib/dt.jarlib

删除和类似文件会导致三个不同的问题:rt.jar

  1. [...]

  2. API 和安全策略文件使用 URL 来命名要授予指定权限的代码库的位置。需要特定权限的运行时系统组件当前通过文件 URL 在文件中标识。例如,椭圆曲线加密提供程序被标识为java.security.CodeSourcelib/security/java.policy

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

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

  3. [...]

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

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

URL 是一个分层 URI,根据 RFC 3986,其语法为jrt

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

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

  • [...]

  • jrt:/$MODULE引用模块 中的所有类和资源文件。$MODULE

  • [...]

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

  1. [...]

  2. 安全策略文件和 API 的其他用法可以使用 URL 来命名特定模块,以便授予权限。例如,椭圆曲线加密提供程序现在可以通过 URL 进行标识CodeSourcejrtjrt

    jrt:/jdk.crypto.ec
    

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

  3. [...]

JEP 200JEP 220都是Project Jigsaw的一部分。


答案 2

我找到了一个(可疑的)解决方案:

grant {
   permission java.security.AllPermission;
};

推荐