IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

Lancer une application externe depuis le serveur


Sujet :

Développement Web en Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut Lancer une application externe depuis le serveur
    Bonjour,

    Je développe actuellement une application web pour mon entreprise. Elle permettra d'automatiser certains traitements lourds.

    Cependant, un des traitements ne peut être automatisé (que ce soit par des batchs ou SQL), et pour simplifier la vie de la personne utilisant l'outil, on compte lui ouvrir le logiciel concerné avec quelques paramètres initialisés.

    Pour faire ses traitements, l'utilisateur est obligé de se trouver sur le serveur (Remote Desktop Connection) (très peu de personne auront accès à cette partie de l'application).

    Le problème:
    Je développe en local sur Windows 7, avec Apache 7 (avec le plugin Eclipse).

    Pour lancer une application externe, j'utilise ProcessBuilder ou encore Runtime.getRuntime().exec("la commande"). Le programme que je suis sensé lancer sur le serveur (PeopleSoft Application Designer) ne fonctionne pas sur Seven, je lance donc à la place Notepad++ pour les tests en local. Ça fonctionne très bien, le logiciel s'ouvre.

    L'ouverture du logiciel est un traitement Ajax:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    String fs = System.getProperty("file.separator");
    String notepad = "C:" + fs + "Program Files (x86)" + fs + "Notepad++" + fs + "notepad++.exe";
     
    ProcessBuilder proc = new ProcessBuilder(notepad);
    proc.redirectErrorStream(true);
    final Process p = proc.start();
     
    // traitement des erreurs avec les streams
    // ...
     
    	if (p.waitFor() == 0)
    	{
                    // sb: StringBuilder qui récupère les flux
                    // renderJSON: transforme l'objet en chaîne JSON
    		renderJSON(sb);
    	}
    }
    catch (IOException e)
    {
    	renderJSON(e);
    }
    catch (InterruptedException e)
    {
    	renderJSON(e);
    }
    Je modifie les chemins pour qu'ils correspondent à ceux du serveur, je crée le .war, je déploie l'appli, je vais sur le serveur (Windows Server 2003 R2), je lance firefox (dernière version comme en local) et vais sur la page concernée. Et le logiciel refuse de se lancer.

    Les chemins sont bons, il n'y a pas de sorties d'erreurs (firebug). J'ai essayé Runtime.getRuntime(), j'ai essayé d'exécuter des batchs qui font des cd puis vont exécuter le logiciel. Rien n'y fait, il ne s'ouvre pas sur cette machine alors que chez moi oui (pour les tests, il y a aussi notepad++ sur le serveur).

    Quelqu'un aurait-il une idée de ce qui se passe ? Ou comment lancer une application externe sur son serveur ?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    As-tu catché toutes les exceptions ?
    Le code Java retourne-t-il un message d'erreur ?
    Le serveur a-t-il les droits pour lancer l'application externe ?
    L'exécutable à lancé est-il à un emplacement exotique, genre disque réseau ?
    Un exécutable simple à la racine du "C:" parvient-il à être exécuté ?
    Vides-tu la sortie et l'erreur standard lorsque l'application externe est lancée ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    As-tu catché toutes les exceptions ?
    Je pense. Mais pour être sur, je viens de remplacer les deux plus haut par Exception afin de tout avoir
    Le code Java retourne-t-il un message d'erreur ?
    En local non, car ça marche (console eclipse). Sur le serveur, je ne sais pas comment le savoir. Lorsque je fais exprès de mettre un chemin erroné, ça va dans le catch et ça m'affiche en rouge sur ma page comme quoi le chemin est introuvable. Et s'il y a des erreurs au niveau stream, je peux les lire grâce à FireBug, hors, la il n'y en a pas.
    Le serveur a-t-il les droits pour lancer l'application externe ?
    Normalement oui. Lorsque je suis dessus, j'arrive à exécuter l'application (que ce soit en double-cliquant sur l'exécutable ou en lançant via cmd).
    L'exécutable à lancé est-il à un emplacement exotique, genre disque réseau ?
    Plus ou moins: "C:/FCPT850/bin/client/winx86/pside.exe" (pour PeopleSoft)
    C:/Program Files/Notepad++/notepad++.exe (pour Notepad++)
    Un exécutable simple à la racine du "C:" parvient-il à être exécuté ?
    Oui, j'ai créé un .bat à la racine avec "echo Hello World" et FireBug montre que ça s'affiche. Mais en essayant avec mon .bat qui est sensé lancer le logiciel, ce dernier ne se lance pas (une fenêtre est sensée s'afficher).
    Sortie firebug:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C:\Program Files\Apache Software Foundation\Tomcat 7.0>cd C:\FCPT850\ 
    C:\FCPT850>cd bin/client/winx86
    C:\FCPT850\bin\client\winx86>pside.exe 
    C:\FCPT850\bin\client\winx86>echo Batch ended 
    Batch ended
    Si je lance les commandes à la main, ça se lance.
    Vides-tu la sortie et l'erreur standard lorsque l'application externe est lancée ?
    Tu parles surement de ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    new Thread() {
    	public void run()
    	{
    		try
    		{
    			BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    			String line = "";
    			try
    			{
    				while ((line = reader.readLine()) != null)
    				{
    					sb.append(line + "\n");
    				}
    			}
    			finally
    			{
    				reader.close();
    			}
    		}
    		catch (IOException ioe)
    		{
    			ioe.printStackTrace();
    		}
    	}
    }.start();

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    En fait j'ai bien l'impression que le programme se lance et se ferme directement juste après. C'est pour ça qu'aucune fenêtre ne s'affiche.

    L'appel Ajax va dans le et retourne immédiatement le code de retour 0...

    Pourquoi ça me fait ça sur le serveur et pas chez moi... D'autant plus que je viens de créer un petit script java sur le serveur qui lance l'application avec ProcessBuilder... Mais dès que ça passe par l'interface web, la ça ne marche plus.


    EDIT:
    Nouvelle avancée. C'est lorsque Apache est lancé en tant que service que les applications ne se lancent pas. Si c'est démarré avec l’exécutable dans le dossier bin/ du répertoire Apache, les applications externes fonctionnent.
    On ne veut pas d'une console ouverte non stop sur le serveur, il faudrait que ça marche en tant que service ou que la console soit cachée.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Pourquoi quand je lance le service Tomcat en mode console, mes applications se lancent depuis mon application web, et lorsque je le lance le service depuis services.msc, mes applications ne se lancent plus ? -__-

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Encore une avancée sur ce problème.

    Il semblerait qu'il ne soit pas lié à Tomcat mais aux services Windows. De base, ils n'ont pas le droit d'ouvrir une interface graphique, car ça peut-être la cause de problème de sécurité. Ou si c'est le cas, l'UI est ouverte dans un environnement spécial appelé Session 0.

    J'ai réussi à démarrer notepad++ depuis le service tomcat sur Windows 7 en démarrant un autre service appelé Interactive Service Detection. Un message indique sur le bureau qu'un service essaye d'interargir avec vous. C'est en acceptant que le bureau bascule dans un environnement dédié à l’exécution du logiciel.

    Le problème, c'est que ce service (Interactive Service Detection) n'existe pas sur Windows Server 2003 (ou du moins, je ne le vois pas). Donc le problème n'est pas réglé.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Encore une avancée (mais toujours pas de résolution).

    Comme noté au début du topic, je me connecte à Windows Server 2003 via le Remote Deskop Connection. Par défaut, la connexion se fait sur une session autre que la 0. Hors les GUI ne s'affichent que sur la session 0 (autre topic au problème similaire).

    J'ai réussi à me connecter sur la session 0 avec le soit disant fameux /console switch (/admin sur Windows Seven et une version de RDC assez avancée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mstsc -v:ip.du.terminal.serveur /F /admin
    Fait assez marrant, lorsque j'ai accédé à la session 0 du TS, toutes les fenêtres que j'avais démarrées avec mon application web et que je ne voyais pas sur l'ancienne session étaient ouvertes...

    Le soucis, c'est que LocalSystem, qui lance mon application graphique, n'a pas les droits selon Oracle pour la lancer ! Alors oui Notepad++ était ouvert, mais PeopleSoft, c'était une 10e de popup d'erreur (Invalid Access ID and password for signon -- see your security administrator).

    Autre problème, je n'arrive pas à lancer le service Tomcat avec un autre utilisateur, et de plus, je ne pense pas qu'on puisse dire à tous les utilisateurs qui utiliseront mon appli qu'ils fassent leur RDC en /admin via cmd...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Bon et bien petit bilan.

    Finalement, nous abandonnons le fait de lancer une application graphique depuis notre application web. Nous lançons à la place des lignes de commande PeopleSoft (pside.exe), ça au moins ça fonctionne, et puis plus besoin de se trouver sur le Terminal Server.

    Ce qu'il faut retenir, c'est que c'est très déconseillé de lancer des applications graphiques depuis un service windows (ici Tomcat7), et que même si vos raisons pour le faire sont légitimes, mieux vaut éviter pour des raisons de sécurité.

    Quoiqu'il en soit, si vous essayez de lancer une appli graphique sur windows Server 2003, assurez vous d'avoir cocher la case "interargir avec le bureau" dans les propriétés du service. Et si vous faites du bureau à distance, le seul moyen de voir votre interface est de vous connectez sur la session 0 (avec l'option /admin de mstsc).
    Aussi n'oubliez pas que votre service est lancé avec les droits de LocalSystem (dans la plupart des cas) et qu'ils sont limités...

    Enfin, si on a mis longtemps à passer aux lignes de commande PeopleSoft, c'est qu'on avait des soucis à les lancer au départ. Il fallait mettre les bons arguments pour que tout marche bien. Notamment cacher le splash screen (-SS NO -SN NO) et spécifier le Connect Id (-CI people -CW password, obligatoire si on veut lancer depuis l'appli web).

    C'était vraiment un problème trop spécifique à mon environnement de travail pour que quelqu'un puisse aider sur ce forum. Néanmoins, si ce topic (dont le sujet de départ n'a finalement que peut de rapport avec le réel problème) a pu aider qui que ce soit, un petit +1 symbolique ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lancer une application externe depuis java
    Par ticle dans le forum Général Java
    Réponses: 2
    Dernier message: 06/03/2014, 08h54
  2. Lancer une application externe depuis une applet
    Par kjimmie dans le forum Applets
    Réponses: 2
    Dernier message: 18/12/2011, 13h19
  3. [API] Lancer une application externe via un code Java
    Par k o D dans le forum Général Java
    Réponses: 19
    Dernier message: 09/03/2006, 15h12
  4. [Runtime]lancer une application externe
    Par biozaxx dans le forum Général Java
    Réponses: 3
    Dernier message: 09/11/2005, 17h13
  5. [Système][Runtime]lancer une application externe
    Par mencaglia dans le forum API standards et tierces
    Réponses: 14
    Dernier message: 22/09/2005, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo