【问题标题】:Starting jstatd in Java 9+在 Java 9+ 中启动 jstatd
【发布时间】:2018-06-25 21:35:15
【问题描述】:

过去,我通过安全策略文件启动 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 java-9 jstatd


    【解决方案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 还需要获得适当的许可并确认上述工作。也感谢Gili 后者。

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


    文档

    来自Policy File Syntax 文档:

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

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

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

    来自JEP 200: The Modular JDK

    设计原则

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

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

    [...]

    来自JEP 220: Modular Run-Time Images

    总结

    重构 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 都是 Project Jigsaw 的一部分。

    【讨论】:

    • 我刚刚在 OpenJDK 11 上测试了您的解决方案,发现您需要将 AllPermissions 授予 jrt:/jdk.jstatdjrt:/jdk.internal.jvmstat。然后 jstatd 启动而不抛出异常。
    【解决方案2】:

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

    grant {
       permission java.security.AllPermission;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2018-11-03
      • 2017-11-12
      相关资源
      最近更新 更多