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

在另一个进程(VM)中启动Java main,java,eclipse,compiler-construction,junit,jvm,Java,Eclipse,Compiler Construction,Junit,Jvm,我有一个服务器客户机项目,出于测试目的,我想在一个全新的过程中启动服务器。问题是,我在project中只有一个main()方法,没有jar。我猜大概是这样的 Runtime.getRuntime().exec("javac MyServer.java"); Runtime.getRuntime().exec("java class MyServer"); 但我真的不确定,而且我也不完全喜欢为每个测试用例启动javac的需要 我应该如何进行 编辑 我想在@Before方法中启动进程,并在@Aft

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

Runtime.getRuntime().exec("javac MyServer.java");
Runtime.getRuntime().exec("java class MyServer");
但我真的不确定,而且我也不完全喜欢为每个测试用例启动javac的需要

我应该如何进行

编辑


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

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

扩大:

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

  • 从Java透视图运行Eclipse(Java项目通常是这样)
  • 您将看到两个工具栏按钮标记为调试。。。以…的身份运行。。。。从现在起,我将描述调试按钮,但相同的原则适用于RunAs
  • 在“调试为”对话框旁边。。。按钮是一个下拉按钮。单击它并从下拉列表中选择调试配置
  • 将打开一个配置对话框。在对话框中双击“Java应用程序”。Eclipse将为调试Java应用程序创建一个新的调试配置
  • 使用右侧的字段选择要调试的Eclipse项目、主类(即,具有要调用的静态主类的类)以及要设置的任何其他参数。您可以为配置指定一个有意义的名称并应用更改
  • 创建两种配置,一种用于客户端,另一种用于服务器,例如“调试客户端”和“调试服务器”
  • 退出对话框
  • 现在调试为。。。下拉列表包含两个新配置的操作。您可以单击它们以调试模式启动应用程序。您将看到每个实例都在一个单独的java.exe进程中运行

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

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

    扩大:

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

  • 从Java透视图运行Eclipse(Java项目通常是这样)
  • 您将看到两个工具栏按钮标记为调试。。。以…的身份运行。。。。从现在起,我将描述调试按钮,但相同的原则适用于RunAs
  • 在“调试为”对话框旁边。。。按钮是一个下拉按钮。单击它并从下拉列表中选择调试配置
  • 将打开一个配置对话框。在对话框中双击“Java应用程序”。Eclipse将为调试Java应用程序创建一个新的调试配置
  • 使用右侧的字段选择要调试的Eclipse项目、主类(即,具有要调用的静态主类的类)以及要设置的任何其他参数。您可以为配置指定一个有意义的名称并应用更改
  • 创建两种配置,一种用于客户端,另一种用于服务器,例如“调试客户端”和“调试服务器”
  • 退出对话框
  • 现在调试为。。。下拉列表包含两个新配置的操作。您可以单击它们以调试模式启动应用程序。您将看到每个实例都在一个单独的java.exe进程中运行

  • Eclipse还有一个调试透视图,您可以在其中停止/暂停正在运行的进程、设置断点等等。它甚至可以同时调试多个东西,这样您就可以在调试中启动客户端和服务器,并在调用的任一侧设置断点。

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

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

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

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

     Runtime r = Runtime.getRuntime();
     Process p = r.exec("java otherMain arg0 arg1");
    
    这将允许您启动另一个java进程。如果您需要,Process还有一些方法可以获取该进程的输出。

    请看一看,我认为您要做的是在运行服务器的情况下对客户端运行一系列测试。您可以通过编写一个JUnit测试来实现这一点,该测试利用注释在每次测试之前运行一个安装方法。例如:

    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
        }
    }
    
    看一看,我认为您要做的是对您的客户机运行一系列测试,同时运行一个服务器。您可以通过编写一个JUnit测试来实现这一点,该测试利用注释在每次测试之前运行一个安装方法。例如:

    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
        }
    }
    

    好吧,假设这将启动一个新的JVM(我不太相信,但不知道),我对exclipse真的很陌生,在运行配置中找不到您所说的内容。您能再给我一点指导吗?我已经更新了我的回答,介绍了如何在Eclipse中调试的步骤。Eclipse可以根据您的需要生成尽可能多的Java实例。它甚至可以生成J2EE应用程序服务器,甚至允许您指定要使用的JRE