Intro JAVA
Ce qu'il faut savoir avant d'aborder la programmation Java proprement dite.
- SUN, JRE & SDK, Path & Classpath
- Cas concrêt d'installation
- Variables d'environnement
- Tests et vérifications
- Complément sur javac, Classpath, jar…
- Packages
- Création d'un premier programme Java sur IBM AS400/ iSeries
- Questions et réponses diverses.
SUN, JRE & SDK, Path & Classpath
Java est un langage développé et fourni par Sun. Sans être sous licence libre stricto sensu, les logiciels de la technologie Java sont gratuitement disponibles et utilisables, voir le Contrat de licence de Code Binaire [http://www.java.com/fr/download/license.jsp] . Voir aussi liste de liens intéressants [http://www.dg77.net/tekno/links.htm#java]
Pour exécuter des programmes Java (fichiers dont le nom se termine par ".class" ou sont dans des ".jar" ou ".zip"), il faut le JRE (Java Run-time Environment), ou "machine virtuelle Java". On appelle classe un programme Java exécutable. Le lancement d'une classe se fera par la commande java suivie du nom du programme (sans son extension .class) et des éventuels paramètres. Exemple pour un programme nommé JDBCAffSpe.class : java JDBCAffSpe parametre_1 parametre_2. Pour exécuter le contenu d'un fichier jar, ajouter l'option "-jar". Exemple : java -jar nom_du_fichier.jar parametre_1… Voir aussi plus bas sur les archives Java
Créer des "classes" : un programme Java est d'abord écrit sous forme de fichier source, dont le nom comporte généralement l'extension ".java". Un simple éditeur de texte suffit. Dans un second temps, on crée la classe (programme Java exécutable). C'est l'opération de compilation pour laquelle on doit disposer d'un SDK (Software Development Kit) ou JDK. Le SDK comprend aussi le JRE. La compilation se fait avec la commande javac, à partir d'un fichier source dont le nom se termine par ".java". Exemple : javac nom_du_programme.java. Après la compilation, un fichier nom_du_programme.class est créé.
Un programme Java créé sur une plate-forme donnée peut étre exécuté sur tout autre système, du moment que ce dernier dispose d'un JRE ; par exemple, on peut copier puis lancer sur un IBM AS400/iSeries un programme compilé sur un PC sous Windows.
Cas concrêt d'installation
Installation sous Linux du J2EE 1.2 SDK
A partir du fichier j2eesdk-1_4-linux.bin …a d'abord fallu installer un package manquant (glibc6 etc.) car : "error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory"
- Le fichier mis dans /opt
- su
- cd /opt
- unzip j2eesdk-1_4-linux.bin
- chmod -R 755 *
- package/jre/bin/java -cp .:package/PackageFormat.jar -Xmx256m appserv
- Apparait alors la fenetre graphique d'installation. etc.
- Voir ci-dessous les valeurs d'environnement.
Variables d'environnement
Généralités
JRE et Variables d'Environnement : pour que fonctionne automatiquement la commande d'exécution d'un programme Java ("java…") il faut que le JRE (plus précisément son sous-répertoire "bin") soit inclu dans la liste des chemins d'accès (le "PATH") du système. Exemple, pour un PC sous Microsoft Windows 2000, pour lequel le JRE se trouve installé dans c:\Program Files\java\jre-1.4.2 il faudra ajouter à la variable d'environnement PATH : c:\Program Files\java\jre-1.4.2\bin
SDK et Variable d'Environnement CLASSPATH : pour que fonctionne automatiquement (entre autres) la commande de compilation ("javac…"), il est préférable que soit créée une variable d'environnement nommée CLASSPATH pointant nommément le fichier tools.jar dans le sous-répertoire lib. Exemple (pour un PC sous Microsoft Windows), si le SDK a été mis dans c:\j2sdk-1.4.2, la variable d'environnement CLASSPATH devra avoir pour valeur c:\j2sdk-1.4.2\lib\tools.jar. On peut aussi utiliser l'option -classpath dans toute commande java, par exemple : javac -classpath c:\j2sdk-1.4.2\lib\tools.jar nom_programme…. Voir aussi plus bas la section "Complément sur javac, Classpath, Packages, jar…"
JAVA_HOME : cette valeur très pratique indique où se trouve la racine du JDK Java.
Sous Windows 95-98
D'abord ouvrir une fenêtre DOS : Démarrer > Exécuter > Command [Entrée]
Pour ajouter le JRE au Path, éditer le fichier autoexec.bat et lui ajouter à la fin la ligne : PATH [chemin_du_dossier_bin];%PATH% Exemple : PATH c:\progra~1\java\jre-1.4.2\bin;%PATH%
Pour enregistrer le CLASSPATH, éditer le fichier autoexec.bat et lui ajouter à la fin la ligne : SET CLASSPATH=%CLASSPATH%;.;[chemin_et_nom_de_tools.jar] Exemple : SET CLASSPATH=%CLASSPATH%;.;c:\j2sdk-~1\lib\tools.jar
JAVA_HOME : Suivre la même méthode que pour CLASSPATH.
Sous Windows NT/2000
Démarrer > Paramètres > Panneau de configuration > Système > Avancé > Variables d'environnement > Variables Système.
Choisir la variable PATH, JAVA_HOME ou CLASSPATH (si elle existe, sinon : > Nouveau…) ; puis ajouter les informations voulues (cf exemples ci-dessus).
Sous UNIX/LINUX
Depend du Shell utilisé. Sous csh : setenv, sous sh ou bash : set…
Exemple supposant l'installation d'un jdk dans /opt/j2sdk (ces lignes peuvent être mises par exemple dans le .bashrc de l'utilisateur) :
Variante pour l'installation décrite plus haut :
Sous Mac OS
Depend du Shell utilisé. tcsh : utiliser setenv, sinon : VARIABLE=[Chemin] puis export… devrait marcher.
Le classpath sur OS400, IBM AS400/iSeries
Utiliser les commandes CL : WRKENVVAR, ADDENVVAR, CHGENVVAR, RMVENVVAR, pour gérer, ajouter, modifier et supprimer une valeur d'environnement.
Tests et vérifications
Sous Windows, la commande set sans option permet d'afficher l'ensemble des valeurs d'environnement, set CLASSPATH donne le CLASSPATH etc. Sous Linux, entrer echo $PATH, echo $CLASSPATH etc.
Configuration du JRE : entrer la commande java -version, on doit obtenir des informations sur la version Java en cours.
Configuration du SDK : si le Classpath est convenablement configuré, l'envoi d'une commande comme javac toto.java peut entraîner l'affichage d'une erreur (il est possible que le programme toto n'existe pas, ou qu'il ne soit pas cherché là où il se trouve, ou qu'il comporte des erreurs…) mais la réponse ne doit pas être que "javac" est une commande inconnue.
Complément sur javac, Classpath, Packages, jar…
javac
Il est conseillé de mettre les fichiers sources (".java") à un autre emplacement que les exécutables. Dans ce cas, on compilera avec l'option -d pour indiquer l'endroit où est créée la classe. Exemple : javac -d ../projet/classes nom_du_programme.java
Pour compiler les membres d'un package (inclus dans un .jar) la syntaxe est : javac -classpath [chemin]/mes_classes.jar … Voir aussi plus bas la section sur les packages.
Encore Classpath
Le CLASSPATH indique où JAVA peut trouver le programme qui est lancé et éventuellement les modules externes auxquels il fait appel. Il peut être modifié par l'option -classpath au moment de l'exécution de la commande "java". Attention, l'option -classpath REMPLACE la valeur d'environnement du même nom, elle ne s'y ajoute pas. Pour inclure cette dernière dans le chemin de recherche, il suffit de l'indiquer dans l'option. Voici 4 exemples pour deux types de systèmes qui aboutissent au même résultat.
- (Windows) java -classpath c:\j2sdk\lib\tools.jar;xalan.jar org.apache.xalan.xslt.Process -in %1.xml -xsl %3.xsl -out %2.html -param ficxml %2.xml
- (Windows) java -classpath %CLASSPATH%;xalan.jar org.apache.xalan.xslt.Process -in %1.xml -xsl %3.xsl -out %2.html -param ficxml %2.xml
- (Unix/Linux) java -classpath /opt/j2sdk/lib/tools.jar:xalan.jar org.apache.xalan.xslt.Process -in $1.xml -xsl $3.xsl -out $2.html -param ficxml $2.xml
- (Unix/Linux) java -classpath $CLASSPATH:xalan.jar org.apache.xalan.xslt.Process -in $1.xml -xsl $3.xsl -out $2.html -param ficxml $2.xml
Dans cet exemple, xalan.jar est supposé être dans le répertoire en cours.
Archives jar
L'exemple précédent montre comment on peut lancer un programme (Process dans le répertoire xslt du package xalan). L'extension jar est l'abréviation de "java archive". Un "jar" est le moyen de regrouper des programmes Java en un bloc à l'intérieur duquel se trouve généralement une arborescence de répertoires. Sur les packages, voir la section plus bas.
Création de fichiers jar : utiliser la commande jar. Exemple : jar uf nom_archive.jar liste_fichiers_a_inclure Le “u” signifie “mise-à-jour” (mettre "c" pour création), le "f" est pour diriger le "flux" des données (sic). Résumé des options :
- c
- Création, avec ou sans contenu
- t
- Liste le contenu
- x [fichiers]
- Extraction, [fichiers] est optionnel
- f
- Le second argument donnera le nom du jar
- v
- Mode bavard
- m
- Inclusion d'un manifeste
- o
- Enregistre sans comprimer
- M
- Ne crée pas de manifeste (cf infra)
- u
- Mise-à-jour
- i
- Crée un fichier INDEX.LIST dans le jar
- C
- Change temporairement le répertoire en cours
- J(option)
- Désigne une des options du lancement d'application Java
Un "jar" peut contenir autre-chose que des classes, on peut y inclure aussi notamment les manuels utilisateurs, la documentation technique des programmes et de l'application, etc. La commande Javadoc permet de générer automatiquement la documentation des classes sous forme de fichiers html. Cette documentation est établie à partir d'un type particulier de commentaires (textes précédés de /** ) inclus dans les fichiers sources.
Démarrage automatique de l'application contenue dans une archive jar : inclure dans le package un fichier "manifest" qui sert entre autres à indiquer la classe lancée initialement. A la commande jar on ajoutera alors l'option "m" et on spécifira ensuite le nom du fichier à utiliser. Ce dernier doit avoir l'extension mf. Exemple de fichier manifeste minimal :
En sortie de l'éditeur de texte, nommer le fichier Projet.mf, puis créer l'archive : jar cmf Projet.mf Projet.jar *.java. Quand on fera java -jar Projet.jar, c'est "MenuGeneral" qui démarrera.
Packages
Revenons à l'exemple précédent qui utilise la classe org.apache.xalan.xslt.Process On remarque que le nom des classes du package xalan est précédées par org.apache. Un package est nommé suivant une convention qui consiste à en ajouter la désignation à son nom de domaine à l'envers (xalan est fourni sur http://www.apache.org). Ainsi on est assuré que le nom sera unique.
Une règle élémentaire de Java est que "package=répertoire". Exemple pour net.mondomaine.projet : suivant cette règle, les classes seront mises sous le répertoire net/mondomaine/projet/. Pour être assuré que la compilation fonctionnera : d'abord se placer à la racine de l'arborescence (i.e. au dessus de "net" cd [racine]) puis compiler ainsi : javac -classpath "." net/mondomaine/projet/nom_programme.java. Il est fréquent qu'un programme java fasse référence à d'autres classe ; avec cette méthode javac trouvera automatiquement ces dernières.
Cas où on sépare les sources des exécutables : tout d'abord, les ".java" doivent être dans une arborescence conforme. Puis on décide d'un emplacement pour les classes. Exemple : créer un répertoire classes sous la racine, puis : javac -d classes -classpath classes net/mondomaine/projet/programme.java. On retrouvera la classe compilée ("programme.class") dans l'arborescence automatiquement générée par javac sous le répertoire classes.
Le programme donné en exemple ci-dessus ne fait appel qu'à un minimum de l'implémentation standard de Java : rien ne s'oppose à sa compilation et même son exécution en test sur le PC. Il en va tout autrement si le programme est plus complexe et "importe" (appelle) des packages (on dit aussi "bibliothèques") pour en utiliser les fonctions. Ces derniers packages importés devront figurer dans le CLASSPATH lors de l'exécution de JAVAC. Par exemple pour créer des programmes destinés à l'AS400, il conviendra d'avoir en ligne au moins jt400.jar.
Identification de/inclusion dans des packages : un coup d'œil au début du programme source java suffit pour les vérifier.
- Importation d'un package : import MonPackage.MaClasse;
- ou encore : import MonPackage.*;
- But : eviter d'avoir à specifier à chaque appel de MaClasse : MonPackage.MaClasse… (encore faut-il que la classe soit declaree publique)
- Indiquer de quel package le fichier fait partie : package MonPackage;
- Tout fichier java fait partie d'un package, i.e. il y a un package par defaut, si pas specifié : java prend toutes les classes du repertoire en cours.
Création d'un premier programme Java sur IBM AS400/ iSeries
Création intégrale sur l'AS400
- Avoir un répertoire dans l'IFS (Integrated File System). Exemple :
- CRTDIR DIR('/corp') [Entrée]
- CRTDIR DIR('/corp/java') [Entrée]
- Eventuellement, créer une bibliothèque et/ou un fichier source, par exemple :
- CRTLIB LIB(mabiblio) [Entrée]
- CRTSRCPF FILE(mabiblio/qjavsrc) [Entrée]
- Par PDM, créer un membre de type TXT, contenant le code JAVA. Dans l'exemple ci-dessous, "MACLASSE", membre saisi dans CORP/QJAVSRC :
- Copier le membre dans l'IFS, sous forme de "STREAM FILE" : CPYTOSTMF [Entrée] Le code 819 crée le fichier en code ASCII.
- Vérifier/mettre à jour le Classpath : WRKENVVAR [Entrée], ajouter éventuellement CLASSPATH avec valeur : '.'
- Lancer le Qshell interpreter : QSH [Entrée]
- Se positionner dans le bon répertoire : cd /corp/java [Entrée]
- Compilation : javac Maclasse.java [Entrée]
- Exécution : java Maclasse [Entrée]
- Ça marche !
- Sortir du QShell : [F12]
Une partie du travail sur "PC"
Une possibilité est de créer le source (Maclasse.java) sur un poste de travail, pour le transférer ensuite dans l'IFS par FTP ou en "mappant" un Lecteur Réseau (créé par Operation Navigator). Attention : en cas d'utilisation de FTP, penser à spécifier ASCII.
Génération de la classe : le fichier peut être compilé sur le PC (création de Maclasse.class). La classe est ensuite transmise à l'as400 par le même moyen.