在Java 9+中启动jstatd

时间:2018-06-25 21:35:15

标签: java java-9 jstatd

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

但是,在Java 9+中,他们删除了tools.jar文件,这意味着该解决方案不再起作用。有谁知道如何解决这个问题? (目前,我又回到了错误消息java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") ...

2 个答案:

答案 0 :(得分:7)

从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."));
    }

}

使用以下命令行:...\jdk-10.0.1\bin\java --add-modules jdk.jstatd Main

已打印出jrt:/jdk.jstatd。鉴于此,您可以尝试:

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

请注意,我只是在这里猜测,还没有对此进行测试。如果您尝试执行此操作,但操作不成功,请告诉我,以便我删除此答案。

更新:以下策略文件在Java 11下有效:

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

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

答案 1 :(得分:1)

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

grant {
   permission java.security.AllPermission;
};