在另一个进程(VM)中启动Java main

问题描述 投票:0回答:3

我有一个服务器客户端项目,出于测试目的,我想在一个全新的进程中启动服务器。问题是,我的项目中只有一个 main() 方法,没有 jar。所以我的猜测是这样的

Runtime.getRuntime().exec("javac MyServer.java");
Runtime.getRuntime().exec("java class MyServer");

但我真的不确定这一点,而且我也不完全喜欢为每个测试用例启动 javac 的需要。

我该如何进行?

编辑

我想在

@Before
方法中启动进程并在
@After
中销毁它。它必须自动运行,因此手动打开服务器不是一个选择。我正在寻找一种消除服务器类编译的方法。但现在我想没有其他办法了。

java eclipse junit jvm
3个回答
2
投票

如果这是出于测试目的,只需从命令行启动其他进程或使用 Eclipse 来处理它。在 Eclipse 中,同一个项目可以有多个 main() 入口点。当您希望运行应用程序时,您可以创建一个运行/调试配置,说明您希望调用哪个入口点。因此,您可以为客户端定义一个,为服务器定义一个,然后单击按钮即可运行它们。

扩展:

先决条件 - 在执行任何操作之前,先将您的项目导入 Eclipse。

  1. 从 Java 角度运行 Eclipse(Java 项目通常是这种情况)
  2. 您将看到两个标记为“调试为...”和“运行为...”的工具栏按钮。从现在开始我将描述“调试”按钮,但同样的原理也适用于“运行为”..
  3. “调试为...”按钮旁边是一个下拉按钮。单击它,然后从下拉列表中选择调试配置...
  4. 将打开一个配置对话框。在对话框中双击“Java 应用程序”。 Eclipse 将创建一个新的调试配置来调试 Java 应用程序。
  5. 使用右侧的字段选择您正在调试的 Eclipse 项目、主类(即具有您希望调用的静态主类的类)以及您想要设置的任何其他参数。您可以为您的配置指定一个有意义的名称并应用更改。
  6. 创建两种配置,一种用于客户端,一种用于服务器,例如“调试客户端”和“调试服务器”
  7. 退出对话框
  8. 现在“调试为...”下拉列表包含新配置的两个操作。您可以单击它们以在调试模式下启动应用程序。您将观察到每个实例都在单独的 java.exe 进程中运行。

Eclipse 还有一个调试视角,您可以在其中停止/暂停正在运行的进程、设置断点等等。它甚至可以同时调试多个事物,因此您可以在调试中启动客户端和服务器,并在调用的任一侧设置断点。


1
投票

Java 允许您像这样进行系统调用。

 Runtime r = Runtime.getRuntime();
 Process p = r.exec("java otherMain arg0 arg1");

这将允许您启动另一个 java 进程。如果需要,进程还具有获取该进程的输出的方法。


0
投票

看看JUnit,我认为您想要做的是在服务器运行的情况下针对您的客户端运行一系列测试。 您可以通过编写 JUnit 测试来实现此目的,该测试使用 @Before 注释在每次测试之前运行设置方法。 例如:

import org.junit.Before

public class TestClient {
    private static final int port = 20000 + new Random().nextInt(10000);
    private MyServer server;

    @Before
    public void setup() {
        // setup server
        server = new MyServer(port);
        server.start();
    }

    @Test
    public void testX() {
        // test x
    }

    @Test
    public void testY() {
        // test y
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.