TP 1 — Compilation + Git
Compiler du Java en console : dépendances, paquetages, archive jar — puis Git local avec gitk, diff et reset, et un premier dépôt GitLab avec .gitignore.
Objectif du TP : comprendre les mécanismes de compilation en Java pour paramétrer
correctement son IDE, puis prendre en main Git en local avant de créer un dépôt GitLab.
Console et éditeur de texte suffisent, sous n'importe quel OS. Règles de fond : une seule
classe par fichier, un fichier du même nom que la classe, une typographie en
CamelCase. Répertoire de base : dev-qu/compil_src, hors de votre projet devS2.
1. Sans dépendance, ni paquetage
La classe A porte un attribut label initialisé à "42", deux constructeurs, un
toString qui renvoie le label, et un main créant et affichant a1 (par défaut) et
a2 (label au choix) :
public class A {
private String label = "42";
public A() {}
public A(String label) { this.label = label; }
@Override public String toString() { return label; }
public static void main(String[] args) {
A a1 = new A();
A a2 = new A("au choix");
System.out.println(a1 + " / " + a2);
}
}Q3 — depuis first/ : javac A.java puis java A ; le binaire naît à côté du
source. Q4 — supprimez le binaire, replacez-vous dans compil_src :
javac first/A.java compile pareil, mais l'exécution exige java -cp first A.
2. Avec dépendance, sans paquetage
Dans second/, copiez A sans son main et ajoutez la classe B fournie, dont le
main crée et affiche un A. Q2 — depuis second/, javac B.java suffit : javac
trouve et compile A au passage. Q4 — la compilation séparée :
javac -d bin second/A.java second/B.java # les binaires vont dans bin/
java -cp bin BL'option -d range les binaires dans bin/ au lieu de les semer à côté des sources.
3. Avec paquetage : la hiérarchie des répertoires
Dans third/, la classe A déclare package third;. Q3 — compilez depuis
compil_src sans compilation séparée, puis exécutez : que se passe-t-il ? Le paquetage
change tout : la classe ne s'exécute plus sous son simple nom — son nom pleinement
qualifié est third.A — et le classpath doit pointer vers le répertoire qui contient
third/, pas vers third/ lui-même. Q4 — avec la compilation séparée, le binaire est
généré dans bin/third/A.class : javac -d bin recrée l'arborescence des paquetages.
Q5 — la commande :
java -cp bin third.A4. Avec dépendance, avec paquetage
Copiez second/A.java dans fourth/ en adaptant son paquetage, compilez dans bin.
Copiez second/B.java dans fifth/, adaptez sa déclaration et ajoutez l'import vers le
paquetage fourth. Exécutez B depuis compil_src :
javac -d bin fourth/A.java fifth/B.java
java -cp bin fifth.BRéflexe à installer : classpath = racine des paquetages, classe = nom pleinement qualifié.
5. Un petit contrôle : bin + jar
Supprimez les binaires de bin, récupérez sur Moodle des sources A, B, C à intégrer
selon leurs déclarations de paquetage, et une archive jar décrivant une classe D —
méthode getSomeText(), paquetage controlpkg1. Écrivez dans compil_src une classe
Main créant et affichant une instance de chacun, puis compilez et exécutez sans
quitter ce répertoire. Le classpath combine binaires et archive :
javac -cp bin:<archive>.jar Main.java
java -cp .:bin:<archive>.jar MainLe classpath est une liste
Répertoires et archives, séparés par : sous Unix (; sous Windows). Pour compiler comme
pour exécuter, il faut tout ce que le code touche : bin pour A, B, C, le jar pour
D.
6. Git local : commits, renommages et diff
Dans dev-qu/git_test, initialisez un dépôt (git init), créez first.txt, indexez-le,
commitez « premier commit ». Lancez gitk en tâche de fond (F5 pour rafraîchir).
Enchaînez : modification et « second commit » ; git mv first.txt first_alt.txt
(consultez l'aide de la commande, vérifiez avec git status) et « renommage » ;
suppression et « suppression fichier » ; création de one et second, remplis des
chiffres impairs pour l'un, des autres pour l'autre. Ajoutez uniquement one à
l'index, puis confrontez les trois comparaisons :
git diff # index ↔ répertoire de travail
git diff --staged # dernier commit ↔ index
git diff HEAD # dernier commit ↔ répertoire de travailAvec one indexé et second modifié mais non indexé : git diff montre l'index contre
le répertoire de travail ; git diff --staged, le dernier commit contre l'index —
exactement ce qui sera commité ; git diff HEAD, le dernier commit contre le répertoire
de travail — tout, indexé ou non.
Terminez par git reset (annule l'index) puis git reset --hard (annule les modifications
depuis la dernière version enregistrée à l'historique).
git reset --hard est destructeur
Il écrase la copie de travail pour revenir au dernier commit : les modifications non
commitées sont perdues. On vérifie son git status deux fois.
7. Le dépôt GitLab
Créer le projet. Connectez-vous sur http://gitlab.univ-lille.fr, « New Project »,
nommez-le dev-oo, paramétrage par défaut. Vous pourrez ensuite travailler depuis
GitLab, cloner puis pousser, ou déposer directement un répertoire existant.
Configurer Git. git config --global user.name "<prénom> <nom>" puis
git config --global user.email "<email>".
Cloner et ignorer. Clonez le dépôt à côté de votre devS2, créez un .gitignore
excluant ce qui se génère (documentation, fichiers binaires), ajoutez-le à l'index,
commitez en « commit initial : gitignore » et poussez.
Importer vos TP. Copiez le contenu de devS2 dans dev-oo, ajoutez tout à
l'index, commitez en « commit initial », poussez, puis vérifiez directement sur
GitLab que les modifications sont bien intégrées.
Si tout s'est bien passé, devS2 devient inutile : vous ne travaillez plus qu'à partir de
dev-oo.
Il fixe le répertoire de destination des binaires, en y recréant l'arborescence des
paquetages : third.A finit dans bin/third/A.class. Sans -d, les binaires se
déposent à côté des sources.
Parce que Main invoque D.getSomeText() : le compilateur doit vérifier cet appel,
donc connaître la classe D. À l'exécution, le jar est à nouveau nécessaire pour
charger son bytecode.
tpQU_01.pdf
R2.03 · TP 1 — Compilation + Git · 4 pages
Chargement du document…
Dernière mise à jour le
Ch. 5 — Introduction aux patrons de conception
Pourquoi le design se dégrade et quels principes le protègent — puis les patrons de conception : familles GoF et trois patrons en profondeur, Singleton (5 implémentations), Facade et Factory.
TP 2 — Classe, documentation et tests
Javadoc complète et tests JUnit 5 fournis sur WarriorCard — puis Event chaîné déléguant à une ToDoList, et Agenda anti-chevauchement dont les tests sont à écrire soi-même.