Forum Clubic

Java: rassembler 2 programmes

voila j ai 2 programmes java qui se lance tous les 2 en console fonctionnant avec 2 jar independant
Pourtant vu que ces 2 programmes sont liés pour mes besoins, je veux qu il se lance tous les 2 en meme temps (ou presque l’un doit être lance un peu avant)

problème: avec eclipse je l ai fait ca j ai intégré le code du programme le plus simple dans le plus compliqué et j ai fait pour que celui qui doit se lancer en premier, se lance en premier…mais ou est le problème me direz vous?
Tout simplement que quand le premier est lancé dans sa fenetre dos, il bloque le fonctionnement et le lancement du 2eme programme…puisque le premier (comme le 2eme) se lance et se mette en attente (et en ecoute) sur des ports IP en temps reel donc il ne s’arrete jamais.
Donc lors que que je lance le premier programme, il se met en ecoute et attent…bloquant l’execution des lignes suivante du code.

comment résoudre ce problème?

merci d’avance

utilise des threads

et dire que je répond pour la deuxieme fois a un Stéphanois ce qui pour un Nantais est très très dur aujourd’hui :ane: . demain ca ira mieux

Soit des Thread pour tout lancer dans le même JVM, soit en batch:
start /B java -jar jar1
start /B java -jar jar2

Pour lancer les 2 instances en arière plan.
:slight_smile:

je trouve que la batch c pas très propre…

suis je oblige de creer 2 threads ou bien un seul (pour un programme) suffirait?

jmgchouchou> courage ce n est qu une defaite…l important c est de participer :slight_smile:

parce que:
new Forwarder("192.168.1.251", 2050, 2051).start(); c est bien un thread…et ca marche pas

ce thread est completement intégré a mon autre programme

Sûr, surtout si c’est pour un client.

>new Forwarder("192.168.1.251", 2050, 2051).start(); c est bien un thread…et ca marche pas

Je ne connaît pas la classe Forwarder, si c’est bien un Thread, ça devrait marcher.
Mais tes 2 progs doivent bien commencer par un main non?
Alors tu lance directement ton main dans des classes Runnable, en plus, il l’idéal est de faire comme dan des serveur d’application (qui lance plusieurs appli dans la même JVM): c’est d’avoir un classLoader et un ThreadGroup par appli, pour éviter que les 2 applis ne se marchent sur les pieds:



public class Launch{
  public static class Launch1 implements Runnable{
    public void run(){
      Appli1.main(new String[]{"argument1","argument2"});
     }
  }
public static class Launch2 implements Runnable{
    public void run(){
      Appli2.main(new String[]{"argument1","argument2"});
     }
  }

public static void main(String[] argv){
  ThreadGroup tg1 = new ThreadGroup("Application1");
  ThreadGroup tg2 = new ThreadGroup("Application2");
// en plus, associer une classe à tg1.unCaughtException(a,b) serait un plus.
  ClassLoader cl1 = new URLClassLoader(new URL[]{
   new URL(argv[1]),new URL(argv[2])
  });
  ClassLoader cl2 = new URLClassLoader(new URL[]{
   new URL(argv[3]),new URL(argv[4])
  });
 Thread t1 = new Thread(tg1,new Launch1(),"application1");
 Thread t2 = new Thread(tg2,new Launch2(),"application2");

 t1.setContextClassLoader(cl1);
 t2.setContextClassLoader(cl2);
t1.start();
t2.start();
}

}


Voilà quelques idées pour faire un lancement propre, il faut travailler un peu sur les classLoader aussi, pour que les Thread soit indépendants: moi je n’ai mis que 2 éléments, mais il faudrait faire autrement (splitter les arguments séparés par des “;” etc.)

Sinon, la solution simple, mais aussi “sale” que le batch, c’est de lancer des lignes de commandes avec Runtime.exec(command)
:wink:

le problème c est que la classe Forwarder est très simple mais l’autre est terrible…

meme si je connais deja ta reponse, peut on seulement lancer ton exemple de programme sur Launch1 ?
le Launch2 serait le code qui suit mais sans code en plus particulier

Oui, tu peux te contenter de lancer le “Lauch1” qui contient ton Thread et laisser le prog se dérouler pour le reste. Et tu peux lancer le Thread à partir d’un Thread “launch1”, ce n’est pas optimal, mais là, ce n’est pas grave.
Quand à utiliser les ThreadGroup et un ClassLoader, ça permet de compartimenter tes exécutions, si jamais les 2 progs utilisent les même classes, mais si le cas ne se présente pas, j’admet que ça complique un peu.

Note pour créer un 2ème classLoader identique à celui du Thread apppelant, il faut penser à préciser le "parent" (ce qui manque un peu dans mon code précédent:


 ClassLoader cl1 = new URLClassLoader(
   Thread.currentThread().getContextClassLoader().getURLs(),
   Thread.currentThread().getContextClassLoader().getParent()
 );

Qu’est ce qui te manque pour appeler la 2ème appli en direct, c’est un gros truc embarqué?
Si c’est un jar exec, tu peux retrouver la “main class” dans le fichier manifest.
:slight_smile: