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: https://www.oracle.com/java/technologies/java-se-glance.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 espace de travail un répertoire POOJava dans lequel vous mettrez tous les TPs concernant le cours POO du M2 CCI.
  2. dans le répertoire POOJava 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)
  2. dans cette fenêtre de commandes taper :
    1. java -version la réponse doit être un numéro de version supérieur ou égal à 17.
    2. javac -version la réponse doit être un numéro de version identique à celui de la version de java
verification de la version de Java présente sour Linux ou Windows

Si vous n'obtenez pas les réponses attendues, il faut installer le JDK et configurer votre environnement avant de pouvoir travailler. Il vous est recommandé d'installer la version 21 qui correspond à la version utilisée sur les machines de l'UFR IM2AG et est la dernière version LTS (Long Time Support) en date au 10/12/2024.

Vous pouvez récupérer et installer un JDK à partir de la page de téléchargement d'Oracle https://www.oracle.com/java/technologies/downloads/

Téléchargement et installation du JDK d'Oralce

Pour l'installation sous Windows vous pouvez vous référer à la vidéo installer JDK 17 sous Windows 10. Pour la version 21 l'installation est similaire que ce soit sous Windows 10 ou Windows 11.

Partie 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 10/12/2024 étant la version 23, la dernière avec un support LTS (Long Time Support) la version 21. 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) :

La documentation de Java SE version 21 est disponible à l'URL http://docs.oracle.com/javase/21 et vous permet d'accéder à un important ensemble de ressources concernant la plateforme Java SE dont vous allez consulter une (petite) partie dans les exercices qui suivent.

Page d'accueil de la documentation du JDK 21

1.1 Tutoriaux java en ligne

Exercice 1.1.1 : En partant de la page d'accueil de la documentation d'Oracle JDK suivez le lien conduisant aux tutoriaux en ligne de Java SE.

  • A quelle version de Java correspondent les tutoriaux proposés ? En quoi cela peut-il poser un problème ?

  • Existe t'il une version plus récente des tutoriaux, si oui à quelle url ?

Exercice 1.1.2 : comme vous l'avez probablement trouvé dans l'exercice précédent le site dev.java propose sur la page https://dev.java/learn/ un certain nombre de tutoriaux modernes prenant en compte les dernières évolutions du langage Java. Ces tutoriaux sont regroupés en différentes catégories (Running Your First Java Application, Staying Aware of New Features, Getting to Know the Language, Mastering the API ...).

Page d'accueil des tutoriaux de dev.java

La catégorie Getting to Know the Language couvre les concepts de base du langage Java qui seront abordés dans le cours POO. Explorez cette catégorie et en particulier le tutorial Java Language Basics et essayez de répondre aux questions suivantes

  • Quels sont opérateurs arithmétiques en Java et combien sont-ils ?
  • Quels sont les opérateurs conditionnels et combien sont-ils ?
  • Quelles sont les instructions de contrôle du flux d'exécution (instructions conditionnelles, boucles, instructions de branchement) ?

1.2 Documentation de l'API de Java SE (21)

Exercice 1.2. : En partant de la page d'accueil de la documentation JDK 21, retrouvez la page présentant l'API du package java.lang (voir figure ci-dessous).

accès à la page de description du package java.lang du module java.base

Depuis la page de description package java.lang accédez à la description de la classe Math (voir figure ci-dessous).

accès à la page de 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 d'angle exprimée en radians en une valeur exprimée en degrés ? (voir la figure ci-dessous sur comment accéder directement aux descriptions des méthodes de la classe)

accès à la description d'une méthode depuis la page de description d'une classe.

Exercice 1.2.2 : Retrouvez la documentation de la classe String elle aussi dans le package java.lang.

  • A quoi sert cette classe ?

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

Exercice 1.2.3 : Retrouvez la documentation du package java.net qui fait partie du module java.base.

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

  • Que représente la classe Socket ?

Exercice 1.2.4 : En utilisant l'outil Search situé en haut de la page de l'API retrouvez la description de la classe JFrame.

  • Quel est le rôle de cette classe ?

  • JFrame. A quel package et quel module appartient cette classe ?

  • A quoi servent les classes définies dans ce module ?

1.3 Documentation des outils du JDK

Exercice 1.3.1 : 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 21 (capture du 10/12/2024)
  • 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 ?

Partie 2 : compiler et exécuter un programme java

2.1 un premier programme java : HelloWorldApp

Cet exercice reprend en partie la leçon Getting Started with Java des tutoriaux du site dev.java (voir Exercice 1.1.). Vous 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.

Exercice 2.1.1 :

  1. Dans votre répertoire de travail (POOJava/TP01) créez un répertoire partie2.

  2. Dans ce répertoire POOJava/TP01/partie2, 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.
    • Dans un terminal placez vous dans le répertoire POOJava/TP01/partie2. 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 de manière à ce qu'il provoque l'affichage suivant :

    BONJOUR
    CECI EST MON
    PREMIER PROGRAMME JAVA

    ou tout autre texte de votre choix s'affichant sur plusieurs lignes ...
    récompilez le et exécutez le.

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. Si vous êtes sur votre machine personnelle ou toute autre machine qui n'est pas direcement sur le réseau de l'UFR IM2AG, il vous faudra au préalable vous connecter sur le VPN de l'UGA.

Exercice 2.2.1 :

  1. Cette étape n'est pas nécessaire si vous êtes sur une machine de l'UFR IM2AG., dans ce cas passez directement à l'etape 2.

    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 ou du client MobaXterm que vous pouvez télécharger et installer gratuitement sur votre machine. Ils vous permettront de faire toutes les commandes via leur interface graphique.

  2. Depuis une 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)

  6. Cette étape n'est pas nécessaire si vous êtes sur une machine de l'UFR IM2AG., dans ce cas passez directement à l'etape 7.

    recopiez sur votre machine personnelle le bytecode que vous venez de générer sur le serveur im2ag-mandelbrot.univ-grenoble-alpes.fr

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

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

  8. A partir 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 ?

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

2.3 Arguments de la ligne de commandes

  1. Sauvegardez dans votre répertoire de travail le programme Hello2.java.

    enregistrement du programme 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 ?

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


2.4 Méthodes dépréciées

Exercice 2.4.1 :

  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

Exercice 2.4.1 :

  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.1) 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 l'instruction Date d = new Date(); par Calendar cal = new GregorianCalendar(); et les instructions 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.

Partie 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 travail (POOJava/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

pour en savoir plus sur la commande 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 ?
      ............................................................................................

  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.

pour en savoir plus sur la commande 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.

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.