在Java 9+中启动jstatd

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)

  • 我刚刚在OpenJDK 11上测试了你的解决方案并发现,你需要将AllPermissions授予`jrt:/ jdk.jstatd`和`jrt:/ jdk.internal.jvmstat`.然后jstatd启动而不抛出异常. (2认同)