当前位置: 首页 > 知识库问答 >
问题:

在Java9中启动jstatd

林元明
2023-03-14

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

但是,在Java9中,他们已经删除了tools.jar文件,这意味着这个解决方案不再起作用。有人知道如何解决这个问题吗?(目前我又回到了获取错误java.security.AccessControlException:访问被拒绝(“java.util.属性权限”“java.rmi.server.ignore子类”“写入”)...

共有2个答案

林蕴藉
2023-03-14

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

grant {
   permission java.security.AllPermission;
};
贺博厚
2023-03-14

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

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

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

感谢Sebastian S指出jdk。内部的jvmstat还需要获得适当的许可,并确认上述工作。也要感谢吉利的帮助。

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

从策略文件语法留档:

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

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

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

来自JEP 200:模块化JDK:

设计原则

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

  • 标准模块的规范由JCP管理,其名称以字符串“java”开头

[...]

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

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

[...]

移除:rt.jar和工具。罐子

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

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

>

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

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

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

[...]

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

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

根据RFC 3986,jrtURL是一个分层URI,其语法如下:

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

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

>

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

[...]

这三种形式的jrtURL解决了上述问题如下:

>

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

jrt:/jdk.crypto.ec

其他模块当前被授予所有权限,但实际上并不需要这些权限,因此可以取消这些模块的权限,也就是说,精确地给出它们所需的权限。

[...]

JEP200和JEP220都是Jigsaw项目的一部分。

 类似资料:
  • 我在Eclipse Oxygen.1a版本(4.7.1a)中的Maven项目中创建了一个简单的Hello World主类和一个module-info.java文件,运行于Java9.0.1。 当我尝试启动主类与右键单击-运行为Java应用程序我得到的错误: 启动层 java初始化期间出错。lang.module。FindException:模块com。github。gv2011。采石场模块。找不到

  • 错误是: 错误:(50,17)错误:没有为startActivities(Intent)方法Activity找到合适的方法。startActivities(Intent[],Bundle)不适用(实际和正式的参数列表长度不同)方法Activity.startActivities(Intent[])方法上下文twrapper.startactivities(Intent[],Bundle)不适用(实

  • 大家好,我正在windows 7中使用xampp v3.2.1。我想在windows启动时自动启动它,但无法启动。 我尝试了这里提供的解决方案,但在服务中找不到任何东西。 我在D驱动器中安装了xampp,这就是为什么apache和mysql在从run打开services.msc时不显示在服务中的原因。 我已经从xampp控制面板的config(配置)按钮尝试过了,我选中了autostart(自动启

  • 我正在使用log4j2。 我想创建一个RollingFileAppender,它每天旋转日志文件。在应用程序启动之前,日志文件的名称是未知的(日志文件名是从应用程序配置组装而来的)。 这就是为什么我需要在运行时添加RollingFileAppender。 我有以下代码: 问题是这段代码完全没有改变什么。未向配置中添加追加器和记录器。以编程方式创建的“文件记录器”不可用。 执行上述代码后,我使用此代

  • 在Appium中开始会话时,我收到以下错误: 错误: 处理命令时发生未知的服务器端错误。原始错误:执行adbExec时出错。原始错误:'命令'C:\用户\satyajit.more\AppData\本地\Android\Sdk\平台工具\adb.exe-P 5037-s模拟器-5554 install'E:\Appium Setup\MobileInsurance_QA_16062018.apk"

  • 我在Windows 7上安装了Xampp。当我尝试启动Xampp时,我收到以下消息,MySql没有启动。 如何解决这个问题? 任何帮助都将不胜感激