Les exercices qui vous sont proposés ici ont pour but de vous faire expérimenter les outils de base du JDK (Java Development Kit) : compilateur, machine virtuelle, documentation...

pour en savoir plus sur JSE (Java Standard Edition) et le JDK: http://www.oracle.com/technetwork/java/javase/overview/index.html


Exercice 0 : Préparation du TP

Organiser votre espace de travail

Avant tout chose organisez votre espace disque afin de pouvoir par la suite retrouver facilement le travail effectué lors des différentes séances de TPs. Pour cela :

  1. créez dans votre répertoire PLAI un sous répertoire Java dans lequel vous mettrez tous les TPs concernant cette partie du cours.
  2. dans le répertoire Java créez un sous répertoire TP01 dans lequel vous rangerez le travail effectué au cours ce premier TP.

Vérifier la présence de java sur votre poste de travail

  1. ouvrir une fenêtre de commandes
    • fenêtre Xterm sous Unix,
    • fenêtre d'invite de commandes sous Windows (menu Démarrer->Exécuter->cmd) (Attention ! pas command.com qui est du vrai MS-DOS pur jus : pas de rappel des commandes (doskey), noms limités à 8 caractères...)
  2. dans cette fenêtre de commandes taper :
    1. java -version la réponse doit être java version "1.8.0" ou un numéro de version supérieur.
    2. javac la réponse doit être Usage: javac <options> <source files> ...

Si vous n'obtenez pas les réponses attendues, il faut installer le JDK et configurer votre environnement avant de pouvoir travailler :

Exercice 1 : consulter la documentation en ligne de Java SE

Ce premier exercice a pour but de vous faire parcourir la documentation de Java SE mise en ligne par Oracle afin de vous familiariser avec son organisation. NE LE NEGLIGEZ PAS ! Pour pouvoir travailler efficacement avec java, il est essentiel de savoir vous servir de cette documentation et de situer rapidement les éléments qui pourraient vous être utiles.

Plusieurs versions de Java SE sont disponibles, la dernière en date (au 03/01/2022) étant la version 17. Lorsque vous utilisez les documentations du JDK, il vaut mieux vous référer à celle correspondant à la version installée sur votre machine (voir exercice 0) :

1.1 Tutoriaux java en ligne

En partant de la page d'accueil de la documentation du JDK retrouvez la page du site officiel d'Oracle pour les tutoriaux en ligne de Java SE (voir image ci-dessous).

La page des tutoriaux Java (capture du 3/01/2022)

  • Quelle est l'URL de la page d'accueil du Tutorial (pensez à l'enregistrer dans vos favoris, elle vous sera utile par la suite) ?

  • Dans la terminologie du Java Tutorial qu'est-ce qu'un trail

  • Sur la page d'accueil du Java Tutorial, combien de trails sont-ils proposés pour couvrir les bases du langage Java ?

  • Que sont les Learning Paths et à quoi servent-il ?

  • Quels aspects de la plateforme Java couvrent chacun des 4 learning paths proposés ?

1.2 Documentation de l'API de Java SE (8 et 17)

En partant de la page d'accueil de la documentation JDK 8, retrouvez la page présentant l'API Java 8 (voir figure ci-dessous).

La page d'accueil de l'API du JDK 8 (capture du 15/12/2020)
  • Quelle est l'URL de cette page ? Pensez à l'enregistrer dans vos favoris, elle vous sera utile par la suite.

  • Que signifie le terme API ?

  • L'API Java est structurée autours de la notion de package. Qu'est-ce qu'un package Java ?

Retrouvez la documentation de la classe Math de l'API java, classe définie dans le package java.lang.

La description de la classe Math du package java.lang
  • Quel est le rôle de cette classe ?

  • Quel est le nom et la signature de la méthode qui permet de transformer une valeur exprimée en radians en une valeur exprimée en degrés ?

  • Retrouvez la documentation du package java.net.

    • Que propose ce package ?

    • Quel est le nom de la classe de ce package qui permet de représenter sous forme d'un objet java une adresse IP v6 ?

  • Retrouvez la documentation de la classe String.

    • A quel package appartient cette classe ?

    • A quoi sert cette classe ?

    • Que fait la méthode toUpperCase de cette classe ?

En partant de la page d'accueil de la documentation JDK 17, retrouvez la page présentant l'API Java 17(voir figure ci-dessous).

La page d'accueil de l'API du JDK 17 (capture du 3/01/2022)
  • Quelle est l'URL de cette page ? Pensez à l'enregistrer dans vos favoris, elle vous sera utile par la suite.

  • Sur cette page les packages n'apparaissent plus directement. L'API est structurée autour de la notion de modules. Qu'est-ce qu'un module ?

  • Dans quel module se trouve le package java.lang

  • En utilisant l'outil Search situé en haut de la page de l'API retrouvez la description de la classe Frame. A quel package appartient cette classe ?

1.3 Documentation des outils du JDK

En partant de la page d'accueil de la documentation JDK retrouvez la page présentant la documentation des outils du JDK (pensez à l'enregistrer dans vos favoris, elle vous sera utile par la suite)

Les pages des outils du JDK 8 et du JDK 17 (capture du 03/01/2022)
  • Parcourez cette documentation pour voir les outils de base du JDK. Pour chacun des outils suivants indiquez son rôle :

    • javac
    • java
    • javadoc
    • javap
    • jdb
    • jar
  • Que signifie l'acronyme jar et qu'est-ce qu'un fichier .jar ?

  • Que signifie l'option -showversion de l'interpréteur java ? Quelle est la différence avec l'option -version ?

Exercice 2 : compiler et exécuter un programme java

Exercice 2.1 : HelloWorldApp

Cet exercice reprend la leçon The "Hello World !" Application du programme d'apprentissage Getting Started des tutoriaux java d'Oracle (voir Exercice 1.1.).

La leçon "Hello World" (capture du 03/01/2022)

Nous n'allez pas ici, suivre ce tutoriel dans son entier, vous pourrez vous y référer pour les étapes de compilation et d'exécution si nécessaire.

  1. Dans votre répertoire de travail (PLAI/Java/TP01) créez un répertoire exercice2.

  2. Dans ce répertoire PLAI/Java/TP01/exercice2, créez avec n'importe quel éditeur de texte de votre choix (par exemple gedit sous linux, notepad++ sous windows) un fichier HelloWorldApp.java dont le contenu est le suivant :

    /**
     * The HelloWorldApp class implements an application that
     * simply prints "Hello World!" to standard output.
     */
    public class HelloWorldApp {
        public static void main(String[] args) {
            System.out.println("Hello World!"); // Display the string.
        }
    }
  3. Compilation de l'application HelloWorldApp.java.
    • Quelle commande utilisez-vous pour compiler le fichier HelloWorldApp.java ?
      ..........................................................................................

    • Quel est le nom du fichier créé par cette commande de compilation ?
      ...............................................................................................

    • Que contient-il ? (Affichez son contenu sur la console, commande type sous Windows, more ou less sous Unix)
      ...............................................................................................

    • Invoquez la commande javap -c HelloWorldApp. Quel est l'effet de celle-ci ?
      ...................................................................................................

  4. Quelle commande utilisez-vous pour executer l'application HelloWorldApp sur la machine où vous l'avez compilée ?
    ................................... .........................................................................

  5. Modifiez le programme HelloWorldApp.java que vous avez écrit dans l'exercice 1 de manière à ce qu'il provoque l'affichage suivant :

    BONJOUR
    CECI EST MON
    PREMIER PROGRAMME JAVA

    ou tout autre texte de votre choix.....
    récompilez le et exécutez le.

Exercice 2.2 : Portabilité du code Java

Si les versions de java sont compatibles, un même programme doit pouvoir être exécuté sur des machines différentes sans nécessiter de recompilation.

Dans cet exercice vous allez devoir accéder au réseau de l'UFR IM2AG. Pour cela il faut au préalable vous connecter sur le VPN de l'UGA.

  1. Recopiez le Byte Code de l'application HelloWorldApp sur la machine im2ag-mandelbrot.univ-grenoble-alpes.fr de l'UFR IM2AG . Par exemple, depuis un fenêtre terminal utilisez la commande scp :

    >scp  HelloWorldApp.class votreLoginAgalan@im2ag-mandelbrot.univ-grenoble-alpes.fr:HelloWorldApp.class
    

    Sous Windows, une alternative à la ligne de commande est l'utilisation du client SSH Bitvise que vous pouvez télécharger et installer gratuitement sur votre machine. il vous permettra de faire toutes les commandes via son interface graphique.

  2. Depuis un fenêtre terminal connectez-vous via ssh sur la machine im2ag-mandelbrot.univ-grenoble-alpes.fr. Pour vous connecter par ssh :

    >ssh votreLoginAgalan@im2ag-mandelbrot.univ-grenoble-alpes.fr
    Password:votre mot de passe
    >
  3. Sans la recompiler, exécutez l'application HelloWorldApp. Qu'observez-vous ? A votre avis pourquoi obtenez-vous ce résultat ?

    ..........................................................................................................
    ..........................................................................................................
    ..........................................................................................................

  4. Recompilez l'application HelloWorldApp.java sur cette seconde machine et verifiez qu'elle s'exécute correctement.

  5. Déconnectez-vous de la machine im2ag-mandelbrot (commande exit) et recopier sur votre machine personnelle le bytecode que vous venez de générer sur le serveur im2ag-oracle.e.ujf-grenoble.fr

    >scp  votreLoginAgalan@im2ag-mandelbrot.univ-grenoble-alpes.fr:HelloWorldApp.class HelloWorldApp.class 
    
  6. exécutez à nouveau, sans recompiler, l'application HelloWorldApp sur votre poste de travail. Que constatez-vous ?

    ..........................................................................................................
    ..........................................................................................................
    ..........................................................................................................

  7. Des observations précédentes, pouvez-vous résumer en une phrase sous quelles conditions un programme java compilé sur une machine A peut être exécuté sans recompilation sur une machine B ?

    ..........................................................................................................
    ..........................................................................................................
    ..........................................................................................................

Exercice 2.3 : Arguments de la ligne de commandes

  1. Sauvegardez dans votre répertoire de travail le programme que vous pouvez télécharger en cliquant sur le lien suivant Hello2.java.

  2. Compilez ce programme et executez le successivement avec les commandes :

    • java Hello2
    • java Hello2 Marie
    • java Hello2 Pierre Paul Jacques
  3. Constatez. En observant le source du programme Hello2.java, que pouvez-vous en déduire sur le rôle du paramètre args de la méthode main ?

    .............................................................................................................
    .............................................................................................................


Exercice 2.4 : Méthodes dépréciées

  1. Créez une classe Java qui contient le programme ci dessous

    import java.util.Date;
    public class AfficherHeure {
    
        public static void main(String[] args) {
            Date d = new Date();
            System.out.print("il est " + d.getHours() + " h ");
            System.out.print(d.getMinutes()+ " m ");
            System.out.println(d.getSeconds() + " s");
        }
    }
  2. Compilez la classe AfficherHeure. Que constatez vous ?

    D'après vous le bytecode généré (fichier AfficherHeure.class) est-il exécutabe ? Vérifiez.

    .......................................................................................................................

  3. La compilation de cette classe vous indique que certaines méthodes utilisées par ce programme sont dépréciées. Présentes dans les premières versions de la plateforme java, ces méthodes ont depuis été remplacées par de nouvelles méthodes introduites dans les versions successives de la plate-forme java. Toutefois les messages de "dépréciation" sont simplement des avertissements (warnings), le code compilé est exécutable. Ces messages sont là pour signifier au programmeur l'utilisation de méthodes dépréciées qui peuvent s'avérer dangereuses ou risquent de ne plus être supportées dans de futures versions de java et qu'il serait préférable de remplacer par de nouvelles fonctionnalités de la plate-forme java.

    Quelle option du compilateur java permet de voir le détail des méthodes dépréciées ?
    .......................................................................................................................

  4. Recompilez la classe AfficherHeure avec cette option. Quelles sont les méthodes dépréciées utilisées dans AfficherHeure ? Dans quelle classe sont elles définies ? Que dit la documentation javadoc à leur sujet ?
    .............................................................................................................................
    .............................................................................................................................
    .............................................................................................................................
    .............................................................................................................................
    ..............................................................................................................................

2.4 : Utilisation de classes d'autres packages

  1. Dans le programme précédent (AfficherHeure) commentez la première ligne

    //import java.util.Date;
    public class AfficherHeure {
    
        public static void main(String[] args) {
            Date d = new Date();
            System.out.print("il est " + d.getHours() + " h ");
            System.out.print(d.getMinutes()+ " m ");
            System.out.println(d.getSeconds() + " s");
        }
    }
  2. Recompiler cette classe ? Que constatez-vous ?

    .............................................................................................................................
    .............................................................................................................................
    .............................................................................................................................
    .............................................................................................................................
    ..............................................................................................................................

  3. Dans l'exercice précédent (2.3) vous avez pu constater que plusieurs des méthodes de la classe Date sont dépréciées. Pour remédier à ce problème, la javadoc de cette classe vous recommande d'utiliser un objet Calendar du package java.util.

    Pour ne plus avoir de message de dépréciation, modifiez le code de AfficherHeure en utilisant non plus un objet Date mais un objet GregorianCalendar. Pour cela, remplacez

    Date d = new Date(); par Calendar cal = new GregorianCalendar();

    et les messages

    d.getHours();, d.getMinutes();, d.getHours();

    par cal.get(Calendar.HOUR_OF_DAY);, cal.get(Calendar.MINUTE); et cal.get(Calendar.SECOND); comme le précise la documentation des méthodes dépréciées.

    Recompiliez. Verifiez qu'il n'y a plus de message de dépréciation et que l'exécution donne bien le résultat attendu.

Exercice 3 : Compilation, exécution, documentation d'une application simple

Lorsque l'on développe une application constituée de plusieurs fichiers il est important de bien organiser ceux-ci sur son espace disque. Ainsi, une organisation classique est de séparer dans différents répertoires les fichiers selon leur nature. Ainsi pour un projet de développement en JAVA on pourra choisir l'organisation suivante : dans un répertoire correspondant au projet définir 3 sous repertoires :

  • un répertoire src (sources) contenant les strong source des classes JAVA

  • un répertoire classes contenant le strong compilé (byte-code) des classes JAVA

  • un répertoire docs contenant la documentation des différentes classes JAVA

Dans l'exercice qui suit, vous allez expérimenter cette organisation avec une application qui permet l'animation de visages sur l'écran. Cette application est constituée de 3 classes Java :

  • VisageRond qui décrit des objets modélisant un Visage animé.

  • Dessin qui décrit l'objet chargé de la gestion et l'affichage des différents objets Visages qu'il contient

  • AppliVisage1 le programe principal qui crée les Visages, les place dans la zone de dessin et lance l'animation.

a) compilation de l'application

  1. Dans votre répertoire de travil (PLAI/Java/TP01)Créez un repertoire Visages avec trois sous répertoires src , docs et classes

  2. Sauvegardez dans le répertoire src les fichiers sources des différentes classes de l'application : VisageRond.java , Dessin.java et AppliVisage1.java

    Le répertoire Visages et ses sous répertoires.

  3. Placez vous dans le répertoire src (commande cd) et compilez l'application AppliVisage1 en utilisant la commande
    javac -d ../classes AppliVisage1.java

    • Quel est le rôle de l'option -d utilisée dans la commande javac ?
      ......................................................................................................

    • Quel aurait été l'effet de la commande javac AppliVisage1.java ?
      ......................................................................................................

    • Quels ont été les fichiers créés par la commande de compilation de la classe AppliVisage1 ?
      ......................................................................................................

    • Qu'en déduisez-vous ?
      .......................................................................................................
      .......................................................................................................
      .......................................................................................................

b) exécution de l'application

  1. Placez-vous dans le répertoire classes (commande cd) et exécutez l'application AppliVisage1. Pour arrêter l'application, cliquez dans la case de fermeture de la fenêtre de l'application ou tappez CTRL C sur la  ligne de commandes.

    • Quelle est la commande utilisée pour lancer cette exécution ?
      .............................................................

  2. Placez vous maintenant dans le répertoire Visages et retapez la commande utilisée précédemment pour l'exécution de l'application AppliVisage1.

    • Quel message est affiché ?
      .....................................................................

    • Que signifie-t'il ?
      .....................................................................

  3. L'option -classpath (ou -cp) de la commande java permet d'indiquer à l'interpréteur Java où trouver les classes à charger.

    • En utilisant cette option quelle est la commande à utiliser pour lancer l'application depuis le répertoire Visages ?
      .....................................................................................................

    pour en savoir plus sur le class path
  4. Déplacez le fichier AppliVisage1.class du répertoire classes vers le répertoire Visages.

    Le répertoire Visages et ses sous répertoires après le déplacement de AppliVisage1.class.

    • Toujours en restant positionné dans le répertoire Visages essayez d'éxecuter l'application AppliVisage1 par la commande java AppliVisage1.

      Que constatez-vous ?
      ..........................................................................................................

      Quelle explication pouvez-vous donner ?
      ............................................................................................................

    • Essayez ensuite d'éxecuter l'application AppliVisage1 par la commande utilisée à la question 3 de cet exercice. Que constatez vous à nouveau ? Qu'en déduisez vous ?
      .............................................................................................................

    • Quelle valeur faut-il donner à l'option -classpath pour pouvoir lancer correctement l'exécution depuis le répertoire Visages (avec dans ce repertoire le fichier AppliVisage1.class, et les fichiers Dessin.class et VisageRond.class situés dans le répertoire classes) ?
      .......................................................................................

c) construction et utilisation de fichiers jar

  1. Replacez vous dans le répertoire classes. Normalement si vous avez respecté les étapes précédentes, ce répertoire ne doit contenir plus que les fichiers Dessin.class et VisageRond.class , fichiers contenant le byte-code des classes Dessin et VisageRond.

  2. Construisez dans le répertoire classes un fichier JAR (Java Archive) de nom visages.jar contenant ces deux fichiers.

    • Quelle est la commande à utiliser ?
      .............................................................................................

    • Si vous ne l'avez pas fait, ajoutez l'option v à la commande utilisée ? Quel est son rôle ?
      ............................................................................................

    pour en savoir plus sur la commande jar
  3. Que fait la commande jar tvf appliquée au fichier jar que vous venez de créer ?
    .....................................................................................................

  4. Déplacez le fichier jar dans le répertoire Visages.

  5. Replacez vous dans le répertoire Visages et lancez à nouveau l'exécution en utilisant ce fichier jar dans l'option -classpath de la commande java.

    • Quelle est la commande à utiliser pour lancer cette exécution ?
      ..............................................................................................

  6. D'après vous quel est l'interêt des fichiers jars ? (Des éléments de réponse sont dans la documentation de la commande jar)
    ..........................................................................................................................
    ..........................................................................................................................
    ..........................................................................................................................

d) génération automatique de la documentation

Pour comprendre le fonctionnement et le rôle des différentes classes de l'application Visages vous allez générer la documentation de celles-ci à l'aide de l'outil javadoc.

  1. Si il n'existe pas encore, créez un répertoire docs dans le répertoire Visages

  2. Placez vous dans le répertoire src et lancez la commande javadoc -d ../docs *.java.

    • Quels fichiers cette commande a-t-elle créés (et où se trouvent-ils) ?
      ............................................................................................
      ............................................................................................

  3. Le point d'entrée de la documentation générée est le fichier index.html.

    • Ouvrez ce fichier depuis votre navigateur et parcourez cette documentation.

    • La documentation de la classe VisageRond référence un image que vous trouverez ici : figurevisage.gif. Pour que la documentation soit complète recopiez cette image dans le répertoire docs.

    • En comparant la documentation générée et le strong source des différents classes Java, pouvez-vous déduire quels ont été les élements des fichiers sources ayant permis de produire cette documentation ?
      ............................................................................................
      ............................................................................................

  4. Les méthodes setDy et getDy de la classe VisageRond ne sont pas documentées.

    • Modifiez le source de la classe VisageRond afin de documenter ces méthodes.

    • Regénérez la documentation.

    • Vérifiez que vos modifications ont correctement été prises en compte.

pour en savoir plus sur la commande javadoc

e) Modification d'une classe de l'application

  1. Modifiez le source de classe VisageRond afin que la taille par défaut d'un visage soit de 100x100 pixels au lieu de 50x50 pixels

  2. Recompilez cette classe (en prenant bien soin de placer le fichier bytestrong dans le répertoire classes).

    • Quelle commande avez vous utilisée ?
      ................................................................................

    • Quelles ont été les classes recompilées ?
      ................................................................................

  3. Vérifiez que votre modification fonctionne en réexécutant l'application AppliVisage1.

    • Quelle commande avez vous utilisée pour cette exécution ?
      .......................................................................................

pour en savoir plus sur la création et manipulation d'objets en Java : Création, Référencement d'objets et envoi des messages

f) Erreurs de compilation

  1. Sauvegardez dans le répertoire src le fichier : AppliVisage2.java

  2. Placez vous dans le répertoire src et compilez AppliVisage2 avec la commande javac -classpath ../classes -d ../classes AppliVisage2.java.

    • Quels sont les erreurs de compilation et les corrections que vous proposez ?
      .........................................................................................................
      .........................................................................................................
      .........................................................................................................
      .........................................................................................................
      .........................................................................................................
      .........................................................................................................

  3. Après avoir effectué ces modifications, recompilez et exécutez l'application AppliVisage2.

g) Erreurs d'exécution

  1. Sauvegardez dans le répertoire src le fichier : AppliVisage3.java

  2. Placez vous dans le répertoire src et compilez AppliVisage3 avec la commande javac -classpath ../classes -d ../classes AppliVisage3.java

  3. Exécutez l'application AppliVisage3.

    • Que se passe-til ?
      ..........................................................................................

  4. A l'aide du message d'erreur produit, localisez et corrigez l'erreur. Quelle correction avez vous effectuée ?
    .....................................................................................................................
    .....................................................................................................................
    .....................................................................................................................

  5. Recompilez et réexecutez cette application.