过去,我已经通过安全策略文件启动了jstatd,如下所示: https://stackoverflow.com/a/14930180/1294116
但是,在Java 9+中,他们删除了tools.jar
文件,这意味着该解决方案不再起作用。有谁知道如何解决这个问题? (目前,我又回到了错误消息java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") ...
)
答案 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;
};