目标:我有客户端-服务器程序,其中客户端和服务器在不同的 jvm 中运行。为了测试相同,我想以编程方式在不同的 JVM 中调用服务器,然后使用当前 jvm 运行客户端并执行不同的 C/S 测试。
有什么方法可以以编程方式在不同的 jvm 中执行方法或运行 Java 命令?
1)java中最强大的运行进程的工具是ProcessBuilder:
ProcessBuilder pb = new ProcessBuilder("java", "-server", "-jar", "yourJar.jar");
Process p = pb.start();
与使用Process相比,您可以操作子进程,例如读取InputStream、销毁等
2)如果您能够编辑两个源代码,请查看此问题以在同一主机上的 JVM 之间建立有效的通信。如果您无法更改代码,只需创建自己的加载器来加载服务器并实现 JVM 之间的通信并调用您需要的方法,因为它在同一个 JVM 空间中。
您几乎可以运行您手动运行的任何命令
Runtime.getRuntime().exec(command);
有关更多信息,请参阅 Runtime.getRuntime().exec(...) 文档。
但还要注意,使用 exec 运行任何特定于平台的命令将剥夺您的程序的平台独立性。
前段时间我看到有人使用“mv”来移动文件。这使得整个程序特定于基于 Unix 的操作系统。Java 或任何基于虚拟机的语言的魅力在于其平台独立性。
您可以使用命令行:
Runtime.getRuntime().exec("java -server MyServer")
或者,如果您想构建一些更复杂的调用,只需使用http://commons.apache.org/exec/来构建和运行程序。
据我所知,这对于普通的 java 是不可能的。可能启用网格的框架可以提供一种在多个 JVM 上运行 java 程序的方法。这里解决了一个类似的问题:
如何运行-a-java-file-project-in-remote-jvm-which-is-present-in-other-network