2010-02-03 17 views
14

Estoy ejecutando Eclipse 3.5 y tengo un problema frecuente que para probar mi programa, tengo que hacer unos 6-7 clics en lugar de un clic en el botón de reproducción.Ejecuta múltiples métodos principales de Java en eclipse

El problema es que estoy escribiendo una aplicación de red y, por lo tanto, tengo una configuración de ejecución para "Servidor" y una configuración de ejecución para "Cliente". Luego, para probar mi programa, tengo que iniciar el servidor, luego un cliente, luego otro cliente, etc. ¿Hay alguna forma de automatizar esto en una configuración de ejecución?

+0

Consulte esta pregunta: http://stackoverflow.com/questions/316761/how-to-launch-multiple-java-programs-with-one-configuration-on-separate-consoles – JesperE

+1

Para resumir todas las respuestas hasta el momento: Eclipse no puede hacerlo, necesitará otra herramienta o alguna solución hackish. – lvella

+0

En realidad, hay un boleto abierto en el sitio de Eclipse que solicita esta misma funcionalidad. Uno de los colaboradores propuso un complemento que permite agrupar más configuraciones de lanzamiento e iniciarlas todas a la vez. Aunque su funcionalidad es limitada, hace un gran trabajo. El código fuente está incluido para que pueda hacer los cambios necesarios. Disponible aquí: https://bugs.eclipse.org/bugs/show_bug.cgi?id=39900#attach_177951 –

Respuesta

16

Puede llamar directamente al método principal de cualquier clase. Por ejemplo, si tiene clases de Servidor y Cliente y quiere ejecutar un servidor y dos clientes, esto es lo que puede hacer.

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'); 
    } 
} 

¡Hecho!

Bueno, casi. Es posible que desee demorar un poco antes de llamar al principal del cliente solo para asegurarse de que el servidor esté funcionando correctamente.

Uno piensa sin embargo. Todos los servidores y clientes se ejecutarán en la misma JVM. En la mayoría de los casos (que solo quiera probar su interacción y no tenga nada que ver con la carga de clases, ya que se comportará de manera diferente cuando están/no están en la misma JVM), esto debería estar bien. Si realmente desea hacer que se ejecute en JVM diferente, puede usar Ant para ejecutarlos en su lugar.

Algo como esto:

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

Por lo que sólo se puede ejecutar esta hormiga y eso es todo.

Espero que esto ayude.

+0

Necesita agregar fork = "yes" al elemento

+0

también tiene que ponerlos en ... de lo contrario, no se ejecutarán simultáneamente –

1

Bueno, ¿por qué no escribir un caso de prueba usando JUnit. Es decir,

  • Prepara File 2 inmuebles, uno para el servidor y otro para el cliente
  • Escribir un accesorio de prueba, que se inicia un servidor y varios clientes con el fin de ejecutar la prueba
  • Luego escriba su casos de prueba basados ​​en ese

Sé que no deberíamos llamarlo una prueba de unidad, ya que dependería de la red IO. Entonces, llámalo como se sienta apropiado. Mi sugerencia es solo usar JUnit para esto.

1

Puede escribir un programa de inicio simple que iniciará todos los otros programas en una nueva JVM. Para invocar en una nueva JVM, puede usar los métodos Runtime.exec().

Así se hace en muchos senarios de pruebas unitarias.

Su programa de inicio podría tomar una lista de otros programas como argumentos y bifurcarlos cada uno en un nuevo proceso de java.

+0

¿Quiere decir, haga esto para las aplicaciones del cliente, correcto? – user919860

2

Solo para completar la respuesta validada: Si desea ejecutar el servidor y los clientes en paralelo, debe iniciar un nuevo hilo para cada instancia de cliente y servidor. Esto se puede hacer de la siguiente manera:

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) {...} 
} 
1

Ventana -> Nueva ventana

Ejecutar los programas separados por separado.

Cuestiones relacionadas