可以使用Java 9 jshell在另一个JVM中运行代码吗?

时间:2017-07-05 15:06:38

标签: java java-9 jshell

Java 9有一个Java的read-eval-print循环,名为jshell。我从命令行看到它的基本模式。它还能用于远程过程吗?换句话说,我可以连接到另一个Java进程并输入代码片段以在该运行时内运行吗?这将是一种在app服务器中更改配置状态的好方法,而无需使用UI编写管理工具。

5 个答案:

答案 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(适当地更新XXXhostnameXXXport来启动目标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)"使用与上面相同的XXXhostnameXXXport

  • 像这样在远程JVM中运行代码:

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

答案 4 :(得分:0)

试试arthas-mvel,和jshell一样是mvel REPL,通过arthas实现attaching-another-jvm。