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

时间:2010-08-31 07:30:13

标签: java eclipse compiler-construction junit jvm

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

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

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

我该怎么办?

修改

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

3 个答案:

答案 0 :(得分:2)

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

展开:

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

  1. 从Java角度运行Eclipse(通常是Java项目的情况)
  2. 您将看到两个工具栏按钮,标记为Debug As ...和Run As ....我将从现在开始描述Debug按钮,但同样的原则适用于Run As ..
  3. Debug As ...按钮旁边是一个下拉按钮。单击它,然后从下拉列表中选择Debug Configurations ...
  4. 将打开配置对话框。在Dialog中双击“Java Application”。 Eclipse将为调试Java应用程序创建新的调试配置。
  5. 使用右侧的字段选择要调试的Eclipse项目,主类(即具有要调用的静态main的类)以及要设置的任何其他args。您可以为配置指定有意义的名称并应用更改。
  6. 为您的客户创建一个配置,为您的服务器创建一个配置,例如: “debug client”和“debug server”
  7. 退出对话框
  8. 现在,Debug As ...下拉列表包含两个与您的新配置相关的操作。您可以单击它们以调试模式启动应用程序。您将观察到每个实例都在单独的java.exe进程中运行。
  9. Eclipse还有一个调试透视图,您可以在其中停止/暂停正在运行的进程,设置断点等等。它甚至可以同时调试多个内容,因此您可以在调试中启动客户端和服务器,并在调用的任一侧设置断点。

答案 1 :(得分:1)

Java允许您进行类似的系统调用。

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

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

答案 2 :(得分: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
    }
}