Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有其他方法启动远程JVM?_Java_Java 9_Jshell - Fatal编程技术网

Java 是否有其他方法启动远程JVM?

Java 是否有其他方法启动远程JVM?,java,java-9,jshell,Java,Java 9,Jshell,我正在使用JDK9的JShellAPI 目前,JShellAPI在内部自动启动远程JVM。我不想自动启动流程,而是想将这两个流程分开 注意:我知道我可以更改VM选项。但是我想看看虚拟机是否可以在不同的机器上运行 默认的执行控件 如果我指定launch,它会自动使用com.sun.jdi.CommandLineLaunchconnector,根据定义,它实际上会启动java程序。 如果我指定no launch,它将使用com.sun.jdi.SocketListen,正如我所预料的那样,一旦启动服

我正在使用JDK9的JShellAPI

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

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

默认的执行控件

如果我指定launch,它会自动使用
com.sun.jdi.CommandLineLaunch
connector,根据定义,它实际上会启动java程序。 如果我指定no launch,它将使用
com.sun.jdi.SocketListen
,正如我所预料的那样,一旦启动服务器套接字,它就会自动启动。我认为这是出乎意料的

我试过的其他东西

Shell jshell = JShell.builder()
    .executionEngine("jdi:hostname(localhost),launch(false)")
    .build();
jshell.eval("1+2");
我预计这将失败或被卡住,直到一个单独的过程开始

是否有其他方法来指定连接器,或者不启动JVM?(我对“本地”也不感兴趣)


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

编辑:我发现了一个错误-这不应该起作用,因为JDWP没有连接到新VM


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

黑客依赖于替换JShell启动的VM中的代理。它可以通过
远程代理
注入

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

使用SSH,它可能如下所示:

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

A可能涉及克隆和实现,并使用远程连接功能扩展它们。

您能否解释一下代理是什么,为什么需要代理?我真的不明白,在反复回答这个问题之后。1.我们在哪里指定端口?2.remoteAgent如何防止创建新的JVM?3.这个ssh做什么?请解释一下。
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);
    }
}
ssh -R "8000:localhost:$(cat /tmp/jshellargs)" ssh.example.org java jdk.jshell.execution.RemoteExecutionControl 8000