#300 : ProjectForgeApplication.java
projectforge-application/src/main/java/org/projectforge/start/ProjectForgeApplication.java · Point d'entrée Spring Boot · 194 lignes · 128 code · 49 commentaires · 17 vides
Le point d'entrée unique pour l'ensemble du serveur ProjectForge. Exécutez avec ./gradlew bootRun ou java -jar projectforge-application.jar. Annoté avec @SpringBootApplication (active l'auto-configuration, le scan des composants et l'auto-configuration) et @ServletComponentScan (découvre les annotations @WebFilter/@WebServlet pour les servlets Wicket et REST). Étend SpringBootServletInitializer pour la prise en charge du déploiement WAR traditionnel.
Séquence de démarrage
1. Analyse des arguments : Les arguments personnalisés sont extraits avant que Spring Boot ne les traite. --base-dir=/chemin définit le répertoire de travail (logs, configuration, fichiers temporaires). --time-zone=Europe/Berlin définit TimeZone.setDefault(). Les arguments inconnus sont transmis à Spring Boot pour un traitement standard (port, profils, etc.).
2. Résolution du répertoire de base (ordre de priorité) :
① Argument CLI --base-dir → ② propriété système projectforge.base-dir → ③ variable d'environnement PROJECTFORGE_BASE_DIR → ④ ~/.projectforge (par défaut)
3. Initialisation des répertoires : Crée les sous-répertoires logs/, temp/ et fonts/ sous le répertoire de base. Écrit le PID du processus actuel dans temp/projectforge.pid pour la surveillance et les scripts d'arrêt.
4. Configuration du fuseau horaire : Définit TimeZone.setDefault() sur la valeur configurée (par défaut : UTC). Ceci est critique — tous les calculs de date côté serveur utilisent ce fuseau horaire. Le frontend peut afficher les dates dans le fuseau horaire local de l'utilisateur, mais le serveur fonctionne dans une zone unique et cohérente.
5. Bannière de version : Lit META-INF/projectforge-version.properties (généré par Gradle) et enregistre la version, l'horodatage de construction et le hash du commit git.
6. Lancement de Spring Boot : Appelle SpringApplication.run() avec le contexte d'application entièrement configuré.
Gestion des erreurs au démarrage
Conflit de port : Capture ConnectorStartFailedException — si le port 8080 est déjà utilisé, lit le PID existant depuis temp/projectforge.pid et enregistre un message clair : « Le port 8080 est déjà utilisé par le processus PID=XXXXX ». Ne réessaie PAS et ne change PAS automatiquement de port — l'administrateur doit résoudre le conflit manuellement.
Arrêt gracieux : Enregistre un hook d'arrêt via SecurityShutdown qui efface les données sensibles (mots de passe, jetons, clés de chiffrement) de la mémoire lors de la terminaison de la JVM. Il s'agit d'une mesure de défense en profondeur — si le tas de la JVM est vidé après l'arrêt, les données sensibles doivent être remises à zéro.
Hiérarchie des classes
ProjectForgeApplication extends SpringBootServletInitializer — cela permet le déploiement en tant que fichier WAR traditionnel dans un conteneur de servlets (Tomcat, Jetty) en plus du mode serveur embarqué. La méthode configure() est surchargée pour définir les sources sur ProjectForgeApplication.class, indiquant au conteneur de servlets quelle classe de configuration Spring démarrer.
L'annotation @ServletComponentScan est essentielle pour la compatibilité Wicket — Wicket enregistre son filtre via l'annotation @WebFilter plutôt que via FilterRegistrationBean de Spring Boot, et sans @ServletComponentScan, le filtre Wicket ne serait jamais découvert.
Historique Git
| Commit | Ce qui a changé |
868d6abb7 | Copyright 2025→2026 |
63081666f | Copyright 2024→2025 |
b6092df09 | Copyright 2023→2024 |
ab45d51fa | Copyright 2001-2022→2001-2023 |
5f7ef41b8 | Copyright 2021→2022 |
ceb63e8a1 | Copyright 2001-2021 |
7c79f192 | Copyright 2020 |
dd5ca38ac | Commit initial — ProjectForgeApplication créé comme point d'entrée Spring Boot avec analyse des arguments, configuration des répertoires et configuration du fuseau horaire. |
9ebb88522 | Création du projet — ce fichier faisait partie de la structure initiale du projet. |
Pourquoi deux modes de démarrage ? La classe prend en charge à la fois java -jar (Tomcat embarqué via Spring Boot) et le déploiement WAR (Tomcat externe via SpringBootServletInitializer). Le mode WAR est utilisé par les organisations qui disposent d'une infrastructure Tomcat existante et préfèrent déployer ProjectForge aux côtés d'autres applications web. Le mode JAR est plus simple pour le développement et les déploiements Docker.