Java 9有一个Java的read-eval-print循环,名为jshell
。我从命令行看到它的基本模式。它还能用于远程过程吗?换句话说,我可以连接到另一个Java进程并输入代码片段以在该运行时内运行吗?这将是一种在app服务器中更改配置状态的好方法,而无需使用UI编写管理工具。
答案 0 :(得分:7)
简单的答案是否定的,没有办法将jshell附加到正在运行的Java进程。 jshell是一个独立的应用程序,可以在自己的JVM中运行。
答案 1 :(得分:6)
没有正式的方式。
然而,重新绑定代码并通过Java代理在另一个VM上运行它并不困难。然而,这不会像你期望的那样工作,因为不清楚shell应该使用什么类加载器以及它应该如何与正在运行的程序交互。
答案 2 :(得分:1)
回答https://stackoverflow.com/a/48132747/1561345包括一个hacky解决方案和一个建议,清洁解决方案可能是什么。
另一个答案的一部分表明JShell仅在其VM中运行代码是错误的 - JShell默认启动一个单独的JVM,通过JDI传输(至少在Linux上)。但是,是的,我不知道如何做到这一点的官方方式。
答案 3 :(得分:1)
Attaching JShell是一个为此实现了JShell扩展的项目。它使用Java代理与目标JVM进行通信。
我没有使用过它,所以我不能说它的效果如何。
使用-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=XXXhostname:XXXport
(适当地更新XXXhostname
和XXXport
来启动目标JVM,并在使用JShell之前从该JVM调用new uk.org.cinquin.attaching_jshell.ExistingVMRemoteExecutionControl()
。
按如下所示调用JShell:java -cp lib/attaching_jshell.jar jdk.internal.jshell.tool.JShellToolProvider --execution "attachToExistingVM:hostname(XXXhostname),port(XXXport)"
使用与上面相同的XXXhostname
和XXXport
值
像这样在远程JVM中运行代码:
import uk.org.cinquin.attaching_jshell.ExistingVMRemoteExecutionControl;
String s = ExistingVMRemoteExecutionControl.theGoodsForTesting
答案 4 :(得分:0)
试试arthas-mvel,和jshell一样是mvel REPL,通过arthas实现attaching-another-jvm。