在eclipse中运行多个java main方法

时间:2010-02-03 04:22:34

标签: java eclipse

我正在运行Eclipse 3.5,并且我经常遇到问题,为了测试我的程序,我必须做大约6-7次点击而不是单击播放按钮。

问题是我正在编写网络应用程序,因此我有“服务器”的运行配置和“客户端”的运行配置。然后,为了测试我的程序,我必须启动服务器,然后是客户端,然后是另一个客户端等。无论如何要将其自动化为一次运行配置吗?

5 个答案:

答案 0 :(得分:16)

您可以直接调用任何类的main方法。例如,如果您有Server和Client类,并且您想运行一个服务器和两个客户端,那么您可以执行此操作。

public class Server {
    public void main(final String ... $Args) {
         final Server S = new Server();
         S.config($Args);
         S.run();
    }
}

public class Client {
    public void main(final String ... $Args) {
         final Client C = new Client();
         C.config($Args);
         C.run();
    }
}

public class Test_ServerClient {
    public void main(final String ... $Args) {
         Server.main('server1.cfg');
         Client.main('client1.cfg');
         Client.main('client2.cfg');
    }
}

完成!

好吧,差不多。您可能需要在调用主客户端之前做一些延迟,以确保服务器正常运行。

有人想到。所有服务器和客户端都将在同一个JVM上运行。在大多数情况下(你只是想测试它的交互并且与类加载无关,因为当它们不在同一个JVM上时表现不同),这应该没问题。如果你真的想让它在不同的JVM上运行,你可以使用Ant来运行它们。

这样的事情:

<project name="TestServerClient" default="test" basedir=".">
  <target name="test">
       <java classname="my.Server">
         <arg value="server1.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
       <java classname="my.Client">
         <arg value="client1.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
       <java classname="my.Client">
         <arg value="client2.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
  </target>
</project>

所以你可以运行这个蚂蚁就是这样。

希望这有帮助。

答案 1 :(得分:2)

只是为了完成经过验证的答案: 如果要并行执行服务器和客户端,则需要为每个客户端和服务器实例启动一个新线程。你可以这样做:

pulic class Test_ServerClient {
    public static void main(final String[] args) {

        Thread serverThread = new Thread() {
            public void run() {
                Server.main(args);
            }
        };

        Thread clientThread = new Thread() {
            public void run() {
                Client.main(args);
            }
        };

        serverThread.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        clientThread.start();
    }
}

public class Server {
    public static void main(final String[] args) {...}
}

public class Client {
    public static void main(final String[] args) {...}
}

答案 2 :(得分:1)

那么,为什么不使用JUnit编写测试用例。我的意思是,

  • 准备2个属性文件,一个用于服务器,另一个用于客户端
  • 编写测试夹具,启动服务器和多个客户端以运行测试
  • 然后根据
  • 编写测试用例

我知道我们不应该将其称为单元测试,因为它取决于网络IO。因此,无论感觉合适,都要称之为。我的建议只是为此使用JUnit。

答案 3 :(得分:1)

您可以编写一个简单的入门程序,它将启动新JVM中的所有其他程序。要在新的JVM中调用,可以使用Runtime.exec()方法。

这就是它在很多单元测试中的表现。

您的入门程序可以将其他程序列表作为参数,并将它们分别放入一个新的java进程中。

答案 4 :(得分:1)

窗口 - &gt;新窗口

单独运行单独的程序。