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

Applets Java Discussion :

lancer une application - java.lang.reflect.InvocationTargetException


Sujet :

Applets Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 137
    Points : 87
    Points
    87
    Par défaut lancer une application - java.lang.reflect.InvocationTargetException
    Bonjour,

    Le problème concerne cette applet qui doit ouvrir dolphin sous linux, et explorer.exe sous windows :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    import java.io.IOException;
    import java.applet.*;
    import java.awt.*;
     
    public class LanceAppli extends Applet{
    	public void paint(Graphics g)
    	   {
    	       g.drawString("Hello !!!", 30, 30);
    	   }
    	public int execProg() {
    		String nomSex = System.getProperty("os.name").toLowerCase();
    		System.out.println(nomSex);
    		String dir = "/home/damien/www";
    		String chU = "dolphin " + dir;
    		String chW = "C:\\Windows\\explorer.exe " + dir;
    		// String chW="C:\\Windows\\command.com /C set";
    		String cmd = "";
    		// Que va-t-on exécuter ?
    		if (nomSex.indexOf("windows") > -1)
    			cmd = chW;
    		else if (nomSex.indexOf("linux") > -1)
    			cmd = chU;
    		else
    			System.exit(1);
     
    		// Objet environnement d'exécution
    		Runtime r = Runtime.getRuntime();
    		try {
    			Process p = r.exec(cmd);
    		} catch (IOException e) {
    			//System.out.println("" + e);
    			return 0;
    		}		
    		return 1;
    	}
     
    } // fin LanceAppli.java
    Cette applet s'exécute correctement en tant qu'appli java en remplaçant execProg par une main.

    L'applet est signée et s'exécute ainsi :

    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
    <html>
        <head>
            <script type="text/javascript">
                function TestApplet(){
                    test = document.getElementById('apExec').execProg();
                }
            </script>
        </head>
        <body>
            <input type="button" id="lanceApplet" value="Explorateur" onclick="TestApplet()">
            <applet codebase="./class/" code="LanceAppli.class" archive="LanceAppli.jar" 
    			 width="500" height="200" id="apExec">
            </applet>
        </body>
    </html>
    Mais quand je clique sur le bouton dans firefox , j'ai l'erreur suivante :

    uncaught exception: java.security.PrivilegedActionException: java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
    Je ne vois pas ou est le problème, je ne sait pas comment rendre plus parlant l'erreur (je n'ai que des notions en java...).

    Merci d'avance pour toute aide

  2. #2
    Membre régulier Avatar de docr1
    Profil pro
    Inscrit en
    Février 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Je pense que tu dois redefinir les regles pour que ca passe en effectuant un appel direct de HTML


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
     
    import java.io.IOException;
    import java.applet.*;
    import java.awt.*;
     
    public class LanceAppli extends Applet{
     
     
        public void init() {
            // TODO start asynchronous download of heavy resources
            execProg();
        }
     
        public void paint(Graphics g) {
            g.drawString("Hello !!!", 30, 30);
        }
     
        public void execProg() {
     
            java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
     
                @Override
                public Object run() {
                    String nomSex = System.getProperty("os.name").toLowerCase();
                    System.out.println(nomSex);
                    String dir = "c:\\";
                    String chU = "dolphin " + dir;
                    String chW = "C:\\Windows\\explorer.exe " + dir;
                    // String chW="C:\\Windows\\command.com /C set";
                    String cmd = "";
                    // Que va-t-on exécuter ?
                    if (nomSex.indexOf("windows") > -1) {
                        cmd = chW;
                    } else if (nomSex.indexOf("linux") > -1) {
                        cmd = chU;
                    } else {
                        System.exit(1);
                    // Objet environnement d'exécution
                    }
                    Runtime r = Runtime.getRuntime();
                    try {
                        Process p = r.exec(cmd);
                    } catch (IOException e) {
                        //System.out.println("" + e);
                        return 0;
                    }
                    return 1;
                }
     
            });
    }
    }
    J'ai deja eu un probleme de ce genre , et je l'ai resolu comme ca.
    Par contre, je n'ai pas tester ton code , sauf avec netbeans, donc c'est possible que ca te reserve encore quelque surprise. Si c'est le cas, repasse par la .

    Par contre, je suis pas sur que ta valeur de retour passe.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 137
    Points : 87
    Points
    87
    Par défaut
    merci beaucoup pour ton aide !

    La compilation de ton code se passe pas bien, il me conseil l'option -Xint, ce que je fait, et j'obtient :

    javac -Xlint LanceAppli.java
    LanceAppli.java:18: warning: [unchecked] unchecked conversion
    found : <anonymous java.security.PrivilegedAction>
    required: java.security.PrivilegedAction<T>
    java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
    ^
    LanceAppli.java:18: warning: [unchecked] unchecked method invocation: <T>doPrivileged(java.security.PrivilegedAction<T>) in java.security.AccessController is applied to (<anonymous java.security.PrivilegedAction>)
    java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
    ^
    LanceAppli.java:6: warning: [serial] serializable class LanceAppli has no definition of serialVersionUID
    public class LanceAppli extends Applet{
    ^
    3 warnings
    du coup j'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import java.security.*;
    Mais j'ai le même message...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 137
    Points : 87
    Points
    87
    Par défaut
    ce n'était que des warnings, donc pas bien important...

    j'ai avancé dans le code, c'est un problème de permission.

    J'ai maintenant deux erreurs :
    1) au lancement de la page : echec du chargement de l'applet
    2) je rafraichis : exception java.security.AccessControlException : access denied (Java.io.FilePermission <ALL-FILES> execute).

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import java.io.FilePermission;
    import java.io.IOException;
    import java.applet.*;
    import java.awt.*;
    import java.security.*;
     
    public class LanceAppli extends Applet{
    	private static final long serialVersionUID = 1L;
     
    	public void init() {
            // TODO start asynchronous download of heavy resources
            try {
            	execProg();
            }
            catch (IOException e) {
            	System.out.println("" + e);
            }
        }
     
        public void paint(Graphics g) {
            g.drawString("Hello !!!", 30, 30);
        }
     
        public void execProg() throws IOException{
     
        	AccessControlContext acc = AccessController.getContext();
        	FilePermission perm = new FilePermission("/home/damien/www","read");
        	acc.checkPermission(perm);
        	try {
    			AccessController.doPrivileged (
    				new PrivilegedExceptionAction() {
    					public Object run() throws IOException {
    						String nomSex = System.getProperty("os.name").toLowerCase();
    						System.out.println(nomSex);
    						String dir = "/home/damien/www";
    						String chU = "dolphin " + dir;
    						String chW = "C:\\Windows\\explorer.exe " + dir;
    						// 	String chW="C:\\Windows\\command.com /C set";
    						String cmd = "";
    						// Que va-t-on exécuter ?
    						if (nomSex.indexOf("windows") > -1) {
    							cmd = chW;
    						}
    						else 
    							if (nomSex.indexOf("linux") > -1) {
    								cmd = chU;
    							}
    							else {
    								System.exit(1);
    								// Objet environnement d'exécution
    							}
    						Runtime r = Runtime.getRuntime();
    						return r.exec(cmd);
    					}
    				},acc);
        	}
        	catch(PrivilegedActionException e) {
        		throw (IOException) e.getException();
        	}
    }
     
    } // fin LanceAppli.java

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    salut, d'abord oublie tout le doPriviliedged, c'est pas nécessaire. Par contre, en standard, une applet ne peux pas

    1. Accéder aux system.property
    2. exécuter des applications locale


    Pour pouvoir effectuer ces opération, elle doit obtenir des droits privilégiés. Pour cela, les conditions suivantes doivent être remplies:
    1. l'applet doit etre signée
    2. la signature doit etre valide
    3. l'utilisateur doit avoir marqué son accord à l'accès privilégié (boite de dialogue gérée par le plugin java)


    Pour plus d'infos: http://java.developpez.com/faq/java/...#signature_jar

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 137
    Points : 87
    Points
    87
    Par défaut
    oui, mon applet est bien signée.

    Ok, le doPrivilege ne sert donc à rien, j'étais parti à coté, merci de ton aide.

    Le problème est plus un problème de thread apparemment...

    Cette applet à l'air de mieux correspondre à ce que je veux faire :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    import java.lang.*;
     
    public class LanceAppli extends Applet{
    	private static final long serialVersionUID = 1L;
     
    		public void init()
    		{
    			( new LauncherThread() ).start();
                            launchEditor("/home/damien");
    		}
    		public void launchEditor( String path )
    		{
    			synchronized( _threadLock )
    			{
    				_launchPath = path;
    				_threadLock.notifyAll();
    			}
    		}
    		private String _launchPath;
    		private Object _threadLock = new Object();
    		class LauncherThread extends Thread
    		{
    			public void run()
    			{
    				synchronized( _threadLock )
    				{
    					while( true )
    					{
    						try
    						{
    							_threadLock.wait();
    							String[] cmds = new String[ 2 ];
    							cmds[ 0 ] = "dolphin";
    							cmds[ 1 ] = _launchPath;
    							//Runtime r = Runtime.getRuntime();
    							//Process p =  r.exec(cmds[ 0 ] + " " + cmds[ 1 ]);
    							Runtime.getRuntime().exec( cmds );
    						}
    						catch( Exception ex )
    						{
    							System.out.println( "Exception in LauncherThread " + ex.getMessage() );
    						}
    					}
    				}
    			}
    		}
    	}
    Récupérée ici :
    http://tobiaspatton.wordpress.com/20...helper-part-2/

    Je l'ai compilée, signé le jar, il n'y a pas d'erreur, l'applet se lance correctement dans firefox, mais rien ne se passe...là je coince...

    rien ne se passe non plus quand je fais un "run as applet" dans eclipse

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pour la signature, si ton applet est correctement signée t'as du recevoir un message de java te disant que l'applet demande les droits de blabla.... et qu'elle a été signée par blabla.... Une fois que l'utilisateur lui a donné les droits, elle ne devrait plus être bridée.


    Pour la deuxième applet, si tu regarde le code, elle ne fait rien tant qu'on appelle pas la méthode launchEditor(path)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 137
    Points : 87
    Points
    87
    Par défaut
    Oui, j'ai bien eu la fenêtre de demande d'autorisation pour l'applet, mais je ne l'ai eu qu'une seule fois, est-ce normal ?
    J'ai vidé le cache du navigateur mais elle n'apparait toujours pas... est-ce java qui stocke l'autorisation quelque part ?

    Oui, désolé, j'ai copié une mauvaise version du code, j'ai édité le précédent post pour modifier la fonction init() afin de rajouter l'appel à launchEditor : l'appelt se lance bien dans eclipse, mais dolphin ne s'ouvre pas.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 137
    Points : 87
    Points
    87
    Par défaut
    précision pour la compilation : j'utilise un script shell que j'ai fais et que je lance depuis le répertoire source de mon fichier java, il prend en argument le nom de la classe java, test est le nom de la signature :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    javac -d ../class/ $1.java
    cd ../class/
    jar cvf $1.jar $1*.class
    jarsigner $1.jar test
    Voici l'exécution du script :
    damien@damLinux:~/www/dcid-web/applet_explo/src$ ./makeJarSigned.sh LanceAppli
    manifest ajouté
    ajout : LanceAppli.class (entrée = 1078) (sortie = 631) (41% compressés)
    ajout : LanceAppli$LauncherThread.class (entrée = 1273) (sortie = 720) (43% compressés)
    Enter Passphrase for keystore:

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 137
    Points : 87
    Points
    87
    Par défaut
    J'ai trouvé mon erreur : l'applet restait en cache, et en lançant la console java et en vidant le cache, j'ai finalement réussi à ouvrir dolphin.

    Par contre deux questions me viennent :

    1) Comment forcer java à ne pas prendre l'applet en cache ?
    2) Le code ne fonctionne que si je positionne un System.out.println dans la méthode launchEditor !!! pourquoi donc ? (dans eclipse comme sur le navigateur)

    Code fonctionnel (j'appel la méthode launchEditor par un clic sur un bouton avec javascript) :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    import java.lang.*;
     
    public class LanceAppli extends Applet{
    	private static final long serialVersionUID = 1L;
     
    		public void init()
    		{
    			( new LauncherThread() ).start();
    			//launchEditor("/home/damien");
    		}
    		public void launchEditor( String path )
    		{
    			//add(new Label("launchEditor"));
    			System.out.println( "launch");
    			synchronized( _threadLock )
    			{
    				_launchPath = path;
    				_threadLock.notifyAll();
    			}
    		}
    		private String _launchPath;
    		private Object _threadLock = new Object();
    		class LauncherThread extends Thread
    		{
    			public void run()
    			{
    				synchronized( _threadLock )
    				{
    					while( true )
    					{
    						try
    						{
    							_threadLock.wait();
    							String[] cmds = new String[ 2 ];
    							cmds[ 0 ] = "dolphin";
    							cmds[ 1 ] = _launchPath;
    							//Runtime r = Runtime.getRuntime();
    							//Process p =  r.exec(cmds[ 0 ] + " " + cmds[ 1 ]);
    							Runtime.getRuntime().exec( cmds );
     
    						}
    						catch( Exception ex )
    						{
    							System.out.println( "Exception in LauncherThread " + ex.getMessage() );
    						}
    					}
    				}
    			}
    		}
    	}

Discussions similaires

  1. Lancer une application java en tache de fond
    Par nanu dans le forum Langage
    Réponses: 7
    Dernier message: 30/12/2008, 09h27
  2. java.lang.reflect.InvocationTargetException avec Axis1.4 et Tomcat6
    Par KING_OF_GRACELAND dans le forum Services Web
    Réponses: 2
    Dernier message: 20/06/2008, 00h49
  3. lancer une application java sur un serveur distant en exécutant un script shell
    Par M_Dandouna dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 12/06/2008, 14h40
  4. message d'erreur :java.lang.reflect.InvocationTargetException
    Par fripette dans le forum Tomcat et TomEE
    Réponses: 18
    Dernier message: 17/03/2008, 21h44
  5. Lancer une application Java au démarrage
    Par mezoo dans le forum Administration système
    Réponses: 2
    Dernier message: 05/07/2006, 17h02

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