在Java9和x2B中启动jstatd;
过去,我通过安全策略文件启动了jstatd,如下所示: 然而,在Java9+中,他们删除了在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
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”开头
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
显然,这在模块化图像中没有任何意义
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启动,但不引发异常。