gpt4 book ai didi

java - 有启动远程 JVM 的替代方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:10:17 26 4
gpt4 key购买 nike

我正在玩 JDK9 的 JShell API。

目前,JShell API 在内部自动启动远程 JVM。我不想自动启动进程,而是想将这两个进程分开。

注意:我知道我可以更改 VM 选项。但我想看看虚拟机是否可以在不同的机器上运行。

最终默认执行控制reaches this place in code .

如果我指定启动,它会自动使用 com.sun.jdi.CommandLineLaunch 连接器,它实际上根据定义启动 java 程序。如果我指定不启动,它会像我预期的那样使用 com.sun.jdi.SocketListen,一旦它启动服务器套接字,它会自动 starts a remote vm and connects to this socket .我认为这是出乎意料的。

我尝试过的其他事情,

Shell jshell = JShell.builder()
.executionEngine("jdi:hostname(localhost),launch(false)")
.build();
jshell.eval("1+2");

我预计这会失败或卡住,直到另一个进程开始。

是否有替代方法来指定连接器或不启动 JVM? (我对'本地'也不感兴趣)

一些简单的选项,例如能够将 com.sun.jdi.RawCommandLineLaunch 指定为接受自定义命令的连接器,或者能够使用套接字监听连接器并等待其他进程连接.

最佳答案

编辑:我在其中发现了一个错误 - 这不应该起作用,因为 JDWP 没有附加到新的 VM。


是的,这可以通过快速破解来完成。my description的改编版本如下:

黑客攻击依赖于替换由 JShell 启动的 VM 中的代理。它可以通过remoteAgent 注入(inject) execution parameter .

CLASSPATH="<injectpath>" ./jshell --execution "jdi:hostname(localhost),launch(false),remoteAgent(jshellhack.DumpPort),timeout(10000)"

新的虚拟代理必须以某种方式给出它应该连接到的端口号。如果你不介意丑陋的黑客攻击,它可以像将它写入文件一样简单。您还可以利用命名管道。不过,我不建议将此用于任何严肃的事情。

一个简单的代理:

package jshellhack;

import java.nio.file.*;
import java.lang.*;

import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.WRITE;
import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;

public class DumpPort {

public static void main(String[] args) throws Exception {
String str = args[0] + "\n";
OpenOption[] opts = new OpenOption[] { CREATE, WRITE, TRUNCATE_EXISTING };
Files.write(Paths.get("/tmp/jshellargs"), str.getBytes(), opts);
}
}

您计算机上的 JShell 是 JDWP channel 的监听端。要重用现有的远程代理,您必须将选定的端口反向转发到远程端。然后,您必须使用远程端口作为参数在远程端运行原始代理。

使用 SSH,它可能看起来像这样:

ssh -R "8000:localhost:$(cat /tmp/jshellargs)" ssh.example.org java jdk.jshell.execution.RemoteExecutionControl 8000

A more robust solution可能会涉及克隆 JdiDefaultExecutionControlJdiInitiator实现并使用远程连接功能扩展它们。

关于java - 有启动远程 JVM 的替代方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46641749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com