在Java9和x2B中启动jstatd;

在Java9和x2B中启动jstatd;,java,java-9,jstatd,Java,Java 9,Jstatd,过去,我通过安全策略文件启动了jstatd,如下所示: 然而,在Java9+中,他们删除了tools.jar文件,这意味着这个解决方案不再有效。有人知道怎么避开这件事吗?(目前我返回到获取错误java.security.AccessControlException:access denied(“java.util.PropertyPermission”“java.rmi.server.IgnoreSublass”“write”)…)我找到了一个(有问题的)解决方案: grant { pe

过去,我通过安全策略文件启动了jstatd,如下所示:

然而,在Java9+中,他们删除了
tools.jar
文件,这意味着这个解决方案不再有效。有人知道怎么避开这件事吗?(目前我返回到获取错误
java.security.AccessControlException:access denied(“java.util.PropertyPermission”“java.rmi.server.IgnoreSublass”“write”)…

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

grant {
   permission java.security.AllPermission;
};
解决方案 以下策略文件应该适合您(至少在Java 11下):

grant codebase“jrt:/jdk.jstatd”{
权限java.security.AllPermission;
};
授予代码库“jrt:/jdk.internal.jvmstat”{
权限java.security.AllPermission;
};
感谢您指出,jdk.internal.jvmstat还需要获得适当的许可并确认上述工作。也要感谢后者

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


文档 从文件中:

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

下面的示例将读取
foo
属性的权限授予模块
com.hellives

grant codeBase“jrt:/com.greetings”{
权限java.util.PropertyPermission“foo”,“read”;
};
发件人:

设计原则

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

  • 标准模块的规范由JCP管理,其名称以字符串
    “java.”
    开头
  • 所有其他模块都只是JDK的一部分,它们的名称都以字符串“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
    ,来命名存储在运行时映像中的模块、类和资源,而无需显示映像的内部结构或格式

    根据RFC3986,jrtURL是一个分层URI,语法如下

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

    • [……]

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

    • [……]

    以下三种形式的
    jrt
    url解决了上述问题:

  • [……]

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

    jrt:/jdk.crypto.ec
    
    当前已授予所有权限但实际上不需要这些权限的其他模块可以轻松取消权限,即,精确地给定它们所需的权限

  • [……]


  • JEP200和JEP220都是其中的一部分。

    我刚刚在OpenJDK11上测试了您的解决方案,发现您需要将所有权限授予
    jrt:/jdk.jstatd
    jrt:/jdk.internal.jvmstat
    。然后jstatd启动,但不引发异常。