簡體   English   中英

在 Java 9+ 中啟動 jstatd

[英]Starting jstatd in 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") ...

解決方案

以下策略文件應該適合您(至少在 Java 11 下):

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

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

感謝Sebastian S指出jdk.internal.jvmstat也需要被授予適當的權限並確認上述工作。 后者也感謝Gili

如下所示, tools.jar文件被刪除,其中的所有內容都被拆分為模塊。 jstatd工具現在位於jdk.jstatd模塊中。 我找不到有關如何確定哪個工具進入哪個模塊的文檔,盡管Javadoc會事后告訴您。 請注意,某些模塊包含單個工具的代碼,而其他模塊包含多個工具的代碼。


文檔

策略文件語法文檔:

如果您使用的是模塊化運行時映像(請參閱jlink工具),您可以通過將jrt URL 指定為策略文件中的codeBase值來授予對映像中的應用程序和庫模塊的權限。 有關jrt URL 的更多信息,請參閱JEP 220:模塊化運行時圖像

以下示例授予模塊com.greetings讀取foo屬性的com.greetings

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

來自JEP 200:模塊化 JDK

設計原則

JDK 的模塊化結構實現了以下原則:

  • 標准模塊的規范由 JCP 管理,其名稱以字符串"java."開頭"java." .
  • 所有其他模塊只是 JDK 的一部分,名稱以字符串"jdk."開頭"jdk." .

[...]

JEP 220:模塊化運行時圖像

概括

重構 JDK 和 JRE 運行時映像以適應模塊並提高性能、安全性和可維護性。 定義一個新的 URI 方案,用於命名存儲在運行時映像中的模塊、類和資源,而無需透露映像的內部結構或格式。 根據需要修改現有規范以適應這些變化。

[...]

刪除:rt.jar 和 tools.jar

以前存儲在lib/rt.jarlib/tools.jarlib/dt.jar和各種其他內部 JAR 文件中的類和資源文件現在以更高效的格式存儲在lib目錄中的特定於實現的文件中。 這些文件的格式未指定,如有更改,恕不另行通知。

刪除rt.jar和類似文件會導致三個不同的問題:

  1. [...]

  2. java.security.CodeSource API 和安全策略文件使用 URL 來命名要被授予指定權限的代碼庫的位置。 需要特定權限的運行時系統組件當前通過文件 URL 在lib/security/java.policy文件中標識。 橢圓曲線密碼提供者,例如,被標識為

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

    顯然,這在模塊化圖像中沒有意義。

  3. [...]

用於命名存儲模塊、類和資源的新 URI 方案

為了解決上述三個問題,可以使用新的 URL 方案jrt來命名存儲在運行時映像中的模塊、類和資源,而無需透露映像的內部結構或格式。

jrt URL 是一個分層 URI,符合 RFC 3986,語法為

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

其中$MODULE是可選的模塊名稱, $PATH (如果存在)是該模塊中特定類或資源文件的路徑。 jrt URL 的含義取決於其結構:

  • [...]

  • jrt:/$MODULE是指所有的模塊類和資源文件的$MODULE

  • [...]

這三種形式的jrt URL分別解決了上述問題:

  1. [...]

  2. 安全策略文件和CodeSource API 的其他用途可以使用jrt URL 來命名特定模塊以授予權限。 橢圓曲線加密提供者,例如,現在可以通過jrt URL 識別

    jrt:/jdk.crypto.ec

    當前被授予所有權限但實際上並不需要它們的其他模塊可以簡單地取消特權,即,精確地給予它們需要的權限。

  3. [...]

JEP 200JEP 220都是Jigsaw 項目的一部分。

我找到了一個(有問題的)解決方案:

grant {
   permission java.security.AllPermission;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM