#!/usr/bin/env bash # ====================== # CONFIGURATION # ====================== OUT="out" MAIN_CLASS="Main" # Si Main est dans un package, ex: monpackage.Main # ====================== # Se placer dans le dossier du script cd "$(dirname "$0")" cmd="${1:-help}" clean() { if [ -d "$OUT" ]; then echo "Suppression du dossier '$OUT'..." rm -rf "$OUT" else echo "Aucun dossier '$OUT' à supprimer." fi } build() { if ! command -v javac >/dev/null 2>&1; then echo "[ERREUR] javac introuvable dans le PATH" return 1 fi mkdir -p "$OUT" echo "Création de la liste des sources..." mapfile -t sources < <(find . -type f -name "*.java") COUNT="${#sources[@]}" if [ "$COUNT" -eq 0 ]; then echo "[ERREUR] Aucun fichier .java trouvé dans $PWD" return 1 fi echo "$COUNT fichiers trouvés. Compilation..." javac -d "$OUT" "${sources[@]}" ERR=$? if [ "$ERR" -eq 0 ]; then echo "Compilation réussie !" else echo "[ERREUR] Compilation (code $ERR)" fi return $ERR } run() { build if [ $? -eq 0 ]; then echo echo "Exécution de $MAIN_CLASS ..." java -cp "$OUT" "$MAIN_CLASS" fi } count() { COUNT=$(find . -type f -name "*.java" | wc -l) echo "$COUNT fichiers Java trouvés." LIGNES=0 while IFS= read -r file; do NB=$(wc -l < "$file") LIGNES=$((LIGNES + NB)) done < <(find . -type f -name "*.java") echo "$LIGNES lignes Java trouvées." } watch() { echo "Mode surveillance activé : recompilation à chaque changement..." echo "Ctrl+C pour quitter." LASTSTATE="" while true; do CURRENTSTATE=$(find . -type f -name "*.java" -exec stat -c "%n %Y" {} \;) if [ "$CURRENTSTATE" != "$LASTSTATE" ]; then LASTSTATE="$CURRENTSTATE" build fi sleep 2 done } purge() { echo "Suppression des .class hors de '$OUT'..." find . -type f -name "*.class" ! -path "./$OUT/*" -delete } rebuild() { clean purge build } help() { echo "Usage: ./build.sh [option]" echo echo " build - Compile le projet" echo " clean - Supprime le dossier de sortie '$OUT'" echo " run - Compile puis lance $MAIN_CLASS" echo " count - Compte les fichiers et les lignes Java" echo " watch - Recompile automatiquement si un fichier change" echo " purge - Supprime les .class hors de '$OUT'" echo " rebuild - Nettoie, purge et recompile le projet" echo " help - Affiche cette aide" } case "$cmd" in clean) clean ;; build) build ;; run) run ;; count) count ;; watch) watch ;; purge) purge ;; rebuild) rebuild ;; help|*) help ;; esac