Cob*_*117 9 java jstatd java-9
在过去,我已经通过安全策略文件启动了jstatd,如下所示:https: //stackoverflow.com/a/14930180/1294116
但是,在Java 9+中,他们已经删除了该tools.jar文件,这意味着此解决方案不再有效.有谁知道怎么解决这个问题?(目前我回来收到错误java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") ...)
Sla*_*law 12
从Java 9开始,他们将大部分(如果不是全部)tools.jar内容移动到JDK模块中.在这种情况下,jstatd工具被移动到自己的模块:jdk.jstatd.为了找出这个模块的位置(代码库),我运行了以下代码:
public class Main {
public static void main(String[] args) {
ModuleLayer.boot() // ModuleLayer
.configuration() // Configuration
.findModule("jdk.jstatd") // Optional<ResolvedModule>
.orElseThrow() // ResolvedModule (or throw)
.reference() // ModuleReference
.location() // Optional<URI>
.ifPresentOrElse(System.out::println, () -> System.out.println("Location unknown."));
}
}
Run Code Online (Sandbox Code Playgroud)
使用此命令行: ...\jdk-10.0.1\bin\java --add-modules jdk.jstatd Main
这打印出来了jrt:/jdk.jstatd.鉴于此,您可以尝试:
grant codebase "jrt:/jdk.jstatd" {
permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)
请注意,我只是猜测这里并没有测试过这个.如果您尝试这个并且它不起作用,请告诉我,以便我可以删除此答案.
更新:以下策略文件在Java 11下工作:
grant codebase "jrt:/jdk.jstatd" {
permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {
permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)