【问题标题】:Run multiple java main methods in eclipse在eclipse中运行多个java main方法
【发布时间】:2010-02-03 04:22:34
【问题描述】:

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

问题是我正在编写网络应用程序,因此我有一个“服务器”的运行配置和一个“客户端”的运行配置。然后要测试我的程序,我必须启动服务器,然后是客户端,然后是另一个客户端等。有没有办法将它自动​​化到一个运行配置中?

【问题讨论】:

  • 总结到目前为止的所有答案:Eclipse 做不到,您需要其他工具或一些 hackish 解决方案。
  • 实际上在 Eclipse 站点上打开了一张票,它请求了同样的功能。那里的一位贡献者提出了一个插件,该插件允许对更多启动配置进行分组并立即启动所有配置。虽然它的功能有限,但它做得很好。包含源代码,因此您可以根据需要进行更改。在这里可用:bugs.eclipse.org/bugs/show_bug.cgi?id=39900#attach_177951

标签: java eclipse


【解决方案1】:

你可以直接调用任何类的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');
    }
}

完成!

嗯,差不多。您可能希望在调用客户端的 main 之前做一些延迟,以确保服务器已启动并正常运行。

尽管如此。所有服务器和客户端都将在同一个 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>

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

希望这会有所帮助。

【讨论】:

  • 您需要在 ant.apache.org/manual/Tasks/java.html
  • 你还必须把它们放在 ... 否则它们不会同时运行
【解决方案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) {...}
}

【讨论】:

    【解决方案3】:

    好吧,为什么不使用 JUnit 编写一个测试用例。我的意思是,

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

    我知道我们不应该将其称为单元测试,因为它取决于网络 IO。所以,随便叫它什么感觉合适。我的建议只是为此使用 JUnit。

    【讨论】:

      【解决方案4】:

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

      这就是它在许多单元测试场景中的做法。

      您的启动程序可以将其他程序的列表作为参数,并在一个新的 java 进程中分叉它们。

      【讨论】:

        【解决方案5】:

        窗口 -> 新窗口

        分别运行单独的程序。

        【讨论】:

          猜你喜欢
          • 2018-03-29
          • 2011-06-12
          • 1970-01-01
          • 2017-03-27
          • 2013-04-18
          • 2018-08-11
          • 2019-01-15
          • 2011-12-28
          • 1970-01-01
          相关资源
          最近更新 更多