簡體   English   中英

可以使用 Java 9 jshell 在另一個 JVM 中運行代碼嗎?

[英]Can the Java 9 jshell be used to run code in another JVM?

Java 9 有一個用於 Java 的 read-eval-print 循環,稱為jshell 我已經從命令行看到它在基本模式下工作。 它也可以用於遠程進程嗎? 換句話說,我可以連接到另一個 Java 進程並輸入代碼片段以在該運行時中運行嗎? 這將是一種在應用服務器中更改配置狀態的好方法,而無需編寫帶有 UI 的管理工具。

簡單的答案是否定的,無法將 jshell 附加到正在運行的 Java 進程。 jshell 是一個獨立的應用程序,它在自己的 JVM 中運行。

沒有這樣做的官方方法。

然而,通過 Java 代理重新捆綁代碼並在另一個 VM 上運行它並不困難。 然而,這不會像您期望的那樣工作,因為不清楚 shell 應該使用什么類加載器以及它應該如何與正在運行的程序交互。

回答https://stackoverflow.com/a/48132747/1561345包括 一個 hacky 解決方案和 一個建議,干凈的解決方案可能是什么。

另一個答案的一部分表明 JShell 僅在其 VM 中運行代碼是錯誤的 - JShell 默認情況下通過 JDI 啟動一個單獨的 JVM(至少在 Linux 上)。 但是,是的,我不知道如何做到這一點的官方方法。

附加 JShell是一個為 JShell 實現擴展的項目。 它使用 Java 代理與目標 JVM 進行通信。

我沒有使用過它,所以我不能說它的效果如何。

快速檢查后的觀察

  • 自述文件看起來很專業。
  • 代碼看起來很小很簡單,好像很久沒有開發一樣。
  • 錯誤跟蹤器中沒有票,這表明它沒有被使用太多。

項目自述文件中的示例

  • 與啟動目標JVM -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=XXXhostname:XXXport (更新XXXhostnameXXXport如適用),並調用new uk.org.cinquin.attaching_jshell.ExistingVMRemoteExecutionControl()從在使用 JShell 之前的那個 JVM。

  • 調用 JShell 如下: java -cp lib/attaching_jshell.jar jdk.internal.jshell.tool.JShellToolProvider --execution "attachToExistingVM:hostname(XXXhostname),port(XXXport)"使用與上面相同的XXXhostnameXXXport

  • 在遠程 JVM 中運行代碼,如下所示:

     import uk.org.cinquin.attaching_jshell.ExistingVMRemoteExecutionControl; String s = ExistingVMRemoteExecutionControl.theGoodsForTesting

試試arthas-mvel ,它是一個和 jshell 一樣的 mvel REPL,並通過 arthas 實現 attach-another-jvm。

暫無
暫無

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

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