2010-02-03 22 views
14

Sto eseguendo Eclipse 3.5 e ho un problema frequente che per testare il mio programma, devo fare circa 6-7 clic anziché un clic sul pulsante di riproduzione.Esegui più metodi java main in eclissi

Il problema è che sto scrivendo un'applicazione di rete e quindi ho una configurazione di esecuzione per "Server" e una configurazione di esecuzione per "Client". Quindi per testare il mio programma devo avviare il server, quindi un client, poi un altro client, ecc. Esiste comunque la possibilità di automatizzarlo in una configurazione di esecuzione?

+0

Vedere questa domanda: http://stackoverflow.com/questions/316761/how-to-launch-multiple-java-programs-with-one-configuration-on-separate-consoles – JesperE

+1

Per riassumere tutte le risposte finora: Eclipse non può farlo, avrai bisogno di un altro strumento o di qualche soluzione hacker. – lvella

+0

C'è in realtà un ticket aperto sul sito Eclipse che richiede questa stessa funzionalità. Uno dei partecipanti ha proposto un plug-in che consente di raggruppare più configurazioni di avvio e avviarle tutte contemporaneamente. Sebbene la sua funzionalità sia limitata, fa un ottimo lavoro. Il codice sorgente è incluso in modo da poter apportare le modifiche necessarie. Disponibile qui: https://bugs.eclipse.org/bugs/show_bug.cgi?id=39900#attach_177951 –

risposta

16

È possibile chiamare direttamente il metodo principale di qualsiasi classe. Ad esempio, se si dispone della classe Server e Client e si desidera eseguire un server e due client, ecco cosa si può fare.

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

Fatto!

Bene, quasi. Potresti fare qualche ritardo prima di chiamare il principale del client solo per assicurarti che il server sia attivo e funzionante correttamente.

Uno pensa però. Tutti i server e i client verranno eseguiti sulla stessa JVM. Nella maggior parte dei casi (che vuoi solo testare la sua interazione e non avere nulla a che fare con il caricamento di classe in quanto si comportano diversamente quando sono/non sono sulla stessa JVM), dovrebbe andare bene. Se vuoi veramente o eseguirlo su JVM differenti, puoi usare Ant per eseguirli.

Qualcosa di simile a questo:

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

Quindi, si può semplicemente eseguire questa formica e che è.

Spero che questo aiuti.

+0

È necessario aggiungere fork = "yes" all'elemento

+0

devi anche inserirli in ... altrimenti non verranno eseguiti contemporaneamente –

1

Bene, perché non scrivere un test case con JUnit. Voglio dire,

  • Preparare un file di 2 immobili, uno per il server e un altro per il cliente
  • Scrivi un dispositivo di prova, che inizia un server e client multipli al fine di eseguire il test
  • Poi scrivere il casi di test basati su quello

So che non dovremmo chiamarlo un test di unità, come sarebbe a seconda della rete IO. Quindi, chiamalo come sembra appropriato. Il mio suggerimento è solo di usare JUnit per questo.

1

È possibile scrivere un semplice programma di avviamento che avvii tutti gli altri programmi in una nuova JVM. Per invocare in una nuova JVM è possibile utilizzare i metodi Runtime.exec().

Ecco come è fatto in molti senatori di test unitari.

Il tuo programma di avviamento potrebbe prendere un elenco di altri programmi come argomenti e inserirli ciascuno in un nuovo processo java.

+0

Vuoi dire, fallo per le applicazioni client, giusto? – user919860

2

Solo per completare la risposta convalidata: Se si desidera eseguire server e client in parallelo, è necessario avviare un nuovo thread per ogni istanza client e server. È possibile farlo come segue:

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

Finestra -> Nuova finestra

Eseguire i programmi separati separatamente.