Java EE / Spring

Master e-services 2015

View the Project on GitHub gdufrene/java_ee_spring-14

Introduction.

Cette page regroupe les notes de cours et les ressources nécessaires au module Java EE / Spring. Le module est constitué d'une séance d'introduction au outils, suivi de 5 séances de travail sur certaines fonctionnalités apportées par la version "Entreprise" de Java et sur Spring. Le plan de cours est donc le suivant :

Lien vers le slideware d'introduction au cours.

Les outils

Java

Nous allons tout d'abords installer un JDK java 1.8 si ce n'est pas déjà fait. Vérifions si java est déjà installé.

$ java -version
  java version "1.7.0_25"
  Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
  Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
  

Ceci indiquerait que la version 1.7 est installé, mais nous aimerions une version 1.8. Rendez-vous sur Java SE Development Kit 8 Downloads chez Oracle. Téléchargez et installez l'archive.

Installer Java

Il faudra déterminer quel est l'architecture de notre poste de travail. Windows, Linux, Mac OS ? Système 32 bits ou 64 bits ?

$ uname -a
Darwin webpulser-mbp.local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 
PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64

Dans mon cas un mac équipé d'un processeur intel (x86) et 64 bits. La version 11.4.2 du noyau me permet de dire, après une petite recherche, qu'il s'agit de Mac OS X Lion. "A propos de ce mac" aurait aussi pu m'aider. Sous windows appuyer sur [Win]+[Pause] pour ouvrir les propriétés du poste de travail.

Il faudra idéalement ajouter le chemin des binaires java dans la variable d'environnement "PATH" du système. Modifiez le PATH.

Le PATH est une liste de dossiers parcourus par le système pour trouver les commandes exécutables appelées sans en préciser le chemin complet. lorsque vous taper "java" dans l'invite de commande, le système va rechercher dans chacun des dossiers, dans l'ordre ou ils sont définis, un fichier exécutable portant ce nom. Si un tel programme est trouvé il est lancé, sinon vous aurez une erreur du type "java: command not found."
Il est aussi possible d'appeler un programme en précisant son chemin complet. Si vous taper "/opt/jdk1.8.0_11/bin/java -version" c'est ce programme en particulier qui sera appelé (en supposant qu'il existe).

Le PATH est une chaine de caractère regroupant l'ensemble des dossier de recherche, séparés par un ':' sous linux/osx et par ';' sous windows.
Pour modifier ce PATH ;
Imaginons que j'utilise linux et que j'ai décompressé l'archive dans /opt, cela a du créer un répertoire jdk1.8.0_11.

$ echo 'export PATH="/opt/jdk1.8.0_11/bin:$PATH"' >> ~/.bashrc
$ . ~/.bashrc
Le fichier .bashrc contenu dans votre répertoire utilisateur est exécuté à chaque fois qu'un shell de type bash est lancé.

Sous mac l'installation du package va se faire dans '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/'. Le fichier à modifier pour le PATH est '.bash_profile' dans le HOME.

$ echo 'export PATH="/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/bin:$PATH"' >> ~/.bash_profile
$ . ~/.bash_profile

Si vous travailler sous OSX, je vous recommande d'installer Homebrew qui pourra sans doute vous aider. C'est un gestionnaire de paquets linux adaptés pour pouvoir fonctionner sous mac. Cela vous permettra d'installer des outils intéressants et utiles venant du monde linux.

Téléchargez ce fichier source, compilons et exécutons. Le fichier source contient quelques nouveautés introduites dans Java 8 telles que les "lamda expressions", la nouvelle API Java Time pour manipuler les Dates, le "StringJoiner", les Streams. Cela ne compilera donc que si vous avez correctement installé le JDK8.

Compiler un source java

Pour compiler un fichier il faut utiliser la commande "javac" suivi du source à compiler. La compilation transforme votre code source texte en une suite d'instructions et de données interprétable par la machine virtuelle java. Ces fichiers compilés seront interprétables quelque soit le système d'exploitation utilisé: "Compile Once, Run Everywhere" (ou presque).

Sans options, cette commande créera des fichiers compilés à l'endroit où vous avez exécuté la commande. Voici une petite liste d'option à connaitre :
-d suivi d'un répertoire permet d'indiquer où les ".class" doivent être créés.
-sourcepath indique l'endroit où rechercher les fichiers sources de l'utilisateur. Lorsque votre compilateur rencontre dans le source une classe qu'il ne connait pas, il essaiera de la rechercher et de la compiler depuis cet endroit
-source permet de s'assurer de la compatibilité des sources java pour une version minimale d'un compilateur. Il peut être en effet pratique d'utiliser cet option si vous possédez une version 1.8 alors que vos collègues utilisent la version 1.7 (et doivent recompiler vos sources)
-target permet de compiler du bytecode qui peut être lu et interprété par une JVM de cette version. La plupart des nouveautés syntaxique peuvent être compilées vers des versions de JVM inférieures. Les nouvelles versions du compilateur introduisent par contre des optimisations et une forme encodée des classes qui peuvent être différentes.

Exécuter un programme java

Pour exécuter votre programme il faut utiliser la commande "java" suivi d'une classe contenant une méthode "main" (sans l'extension .class). C'est le point d'entrée de notre programme java. La signature de cette méthode doit être :
public static void main(String[] args)
Les arguments passés à votre ligne de commande se retrouvent dans le tableau "args" (dont vous pouvez changer le nom évidemment).

Généralement, nous utilisons des "librairies" dont il faudra indiquer le chemin à la JVM pour que les classes dont vous faîtes référence dans votre programme puisse fonctionner. De nombreuses librairies sont chargées de base par la JVM tel que "rt.jar" contenant la définition de java.lang.Integer (et de la plupart des classes fournies avec la JVM).
Les fichiers jar ne sont que des archives "zip" dans lesquelles nous avons rangés nos classes et un fichier META-INF/MANIFEST.MF décrivant éventuellement des informations complémentaires sur le compilateur ou autre ...

Lorsqu'une classe est référencée par une autre, la JVM va en rechercher le code dans les librairies et les dossiers dont vous avez fourni la liste. C'est cette liste que l'on nomme le CLASSPATH, à ne pas confondre avec la variable d'environnement PATH.
Le CLASSPATH se défini à la compilation ou à l'exécution par l'option -cp suivi d'une chaine de caractère reprenant tous les dossiers et librairies dans lesquels la JVM ira chercher après les classes. Chaque dossier ou librairie sera séparé par un ":" sous mac et linux ou par un ";" sous windows.
Sans cette option la JVM ne recherche que dans le répertoire courant (celui dans lequel vous êtes en lançant java).

Vous avez peut être déjà remarqué qu'il est possible d'exécuter des fichiers jar ?
Quand vous double-cliquez dessus dans votre explorateur de fichier, par exemple...
Lorsque vous le faîtes, la commande java -jar fichier.jar est en fait exécuter.
-jar indique à la JVM de rechercher dans ce jar après la classes principale à lancer. Cette recherche se fait dans le fichier MANIFEST dans lequel une "MainClass" doit être indiqué.

Il peut être utile de définir ou re-définir une variable d'environnement pour un programme java en particulier.
-D permet de définir une variable. la syntaxe est : -DmaVariable=maValeur.
c'est une manière de passer un paramètre optionnel à un programme java.

Pour notre exemple minimaliste, une fois le fichier java compilé, exécutez simplement "java TestJava".

Tester votre installation Java
Télécharger ce fichier check.jar.
Exécuter ce jar et mettre en paramètre "init" suivi de votre prénom et votre nom.
exemple : java -jar check.jar init "Guillaume" "Dufrêne"

Attention : l'exécution de "check init" a créé un fichier ".myKeyFile" dans votre répertoire home qui est confidentiel et vous permettra de valider les exercices suivants. Conservez le en copie quelquepart !
Si vous utilisez un autre ordinateur par la suite, vous devez remettre ce fichier dans votre répertoire "home".
Le jar "check.jar" utilise le proxy de l'universtité par défaut. Si vous souhaitez en dehors de la fac, ajouter l'option "-DNoProxy" avant l'option "-jar".

Maven

Maven est un outil permettant de gérer les dépendances, la compilation, le "packaging" et bien d'autres choses ... Il s'utilise au moyen de fichier "pom" décrivant votre projet.
Maven est développé en Java et le script "mvn" utilise la variable d'environement "JAVA_HOME" pour déterminer quelle version de java doit être utilisée. Afin d'éviter tout soucis, initialiser cette variable dans votre ".bashrc" (linux) ou ".bash_profile" (mac) ou dans les propriétés systèmes sous windows.
export JAVA_HOME="/path/to/your/java/Home"

Page de téléchargement de maven : maven.apache.org/download.html
Archive maven 3.3.3 à extraire. Ajouter le répertoire bin à votre PATH, puis vérifier en tapant mvn -v ; vous devriez obtenir quelquechose de ce type :


Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T13:57:37+02:00)
Maven home: /Users/guillaume/install/apache-maven-3.3.3
Java version: 1.8.0_11, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre
Default locale: fr_FR, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.2", arch: "x86_64", family: "mac"

Le principal intérêt de maven est de gérer des dépendances vers des librairies. Ces librairies sont téléchargées depuis un "repository", généralement le repository "central" maven.
A l'université, les connexions sur le web doivent passées par le proxy cache. Pour que maven utilise le proxy, il faut modifier le fichier "settings.xml" situé dans votre 'HOME', dans le répertoire '.m2'
Ce répertoire contiendra également toutes les librairies téléchargées (dans 'repository') par maven au fur et à mesure de son utilisation. Il est possible que ce répertoire devienne assez lourd avec le temps ...
Afin de le pas encombrer votre compte unix avec ces fichiers, je vous recommande de modifier l'endroit où maven stockera les librairies. Ajouter ceci, en l'adaptant, dans votre fichier "settings.xml" :
<localRepository>/local/username/m2<localRepository>

contenu du fichier settings.xml pour la configuration proxy


<settings>
  <proxies>
   <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>cache-etu.univ-lille1.fr</host>
      <port>3128</port>
      <username></username>
      <password></password>
      <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
    </proxy>
    <proxy>
       <active>true</active>
       <protocol>https</protocol>
       <host>cache-etu.univ-lille1.fr</host>
       <port>3128</port>
       <username></username>
       <password></password>
       <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
     </proxy>
  </proxies>
</settings>

Lorsque vous n'êtes pas sur le réseau de l'université pensez à désactiver le proxy ! : <active>false</active>

Voilà votre 2ème outil installé.

Tester votre installation Maven
Exécuter le jar "check.jar" et mettre en paramètre "check-mvn".
java -jar check.jar check-mvn

Autres 'outils' intéressants

Un développeur se doit de maitriser quelques outils 'système' de base afin de faciliter son travail.
Avez-vous entendu parler du mouvement "devops" ?
Il me semble essentiel de vous familiariser à l'usage des commandes 'wget' et 'curl' qui sont extrêmement pratique pour télécharger des archives (ou toutes sortes de choses), et permet d'exécuter différents type de requêtes HTTP (utile en développement web).

Bash peut être configuré pour utiliser le proxy de l'université et permettre à wget / curl de fonctionner correctement.
Il faut ajouter quelques variables d'environnement à votre .bashrc ou votre .bash_profile.


export http_proxy=http://cache-etu.univ-lille1.fr:3128
export https_proxy=https://cache-etu.univ-lille1.fr:3128
export no_proxy=localhost,127.0.0.0/8,*.local

curl est une commande permettant d'afficher le corps HTML d'une réponse d'un serveur web à une url. Cette commande permet également d'envoyer des données en POST ou en GET.

wget est une commande permettant de télécharger dans un fichier le "contenu" indiqué par une url. Cela peut être une page web, ou tout autre fichier.

Vous devriez prendre un peu de temps pour lire les pages "man" de ces deux commandes très utiles lorsque l'on fait du développement web.

Mise en jambes

Nous allons développer un programme qui analysera les données de vol d'un drone afin d'en tirer quelques statistiques.

  1. Etudiez les fichiers sur ce serveur web
  2. Ecrivez un programme qui permet d'extraire l'altitude maximale (GPS) du vol
  3. Modifiez votre programme pour qu'il implémente l'interface suivante, contenu dans ce fichier jar
  4. Pensez à tester avec le fichier de vol fourni

Tester votre analyseur de vol
Télécharger ce fichier zip. Lancez le jar "check" avec les paramètres "alt" suivi du chemin vers le zip et enfin le nom complet (avec le paquetage) de votre classe d'analyse qui implémente l'interface AltPathAnalyser
java -cp chemin/vers/class:check.jar tool.Check check-alt chemin/vers/le/fichier.zip votre.paquetage.FlightAnalyser