EN · DE · RU · FR · ES

#300: ProjectForgeApplication.java

projectforge-application/src/main/java/org/projectforge/start/ProjectForgeApplication.java · Точка входа Spring Boot · 194 строки · 128 кода · 49 комментариев · 17 пустых
Единственная точка входа для всего сервера ProjectForge. Запуск с помощью ./gradlew bootRun или java -jar projectforge-application.jar. Аннотирован @SpringBootApplication (включает автоматическую настройку, сканирование компонентов и автоконфигурацию) и @ServletComponentScan (обнаруживает аннотации @WebFilter/@WebServlet для сервлетов Wicket и REST). Расширяет SpringBootServletInitializer для поддержки традиционного WAR-развертывания.

Последовательность запуска

1. Разбор аргументов: Пользовательские аргументы извлекаются до того, как Spring Boot их обработает. --base-dir=/path устанавливает рабочую директорию (логи, конфигурация, временные файлы). --time-zone=Europe/Berlin устанавливает TimeZone.setDefault(). Неизвестные аргументы передаются в Spring Boot для стандартной обработки (порт, профили и т.д.).

2. Определение базовой директории (порядок приоритета):
① аргумент CLI --base-dir → ② системное свойство projectforge.base-dir → ③ переменная окружения PROJECTFORGE_BASE_DIR → ④ ~/.projectforge (по умолчанию)

3. Инициализация директорий: Создаёт поддиректории logs/, temp/ и fonts/ внутри базовой директории. Записывает текущий PID процесса в temp/projectforge.pid для мониторинга и скриптов завершения.

4. Настройка часового пояса: Устанавливает TimeZone.setDefault() в соответствии с настроенным значением (по умолчанию: UTC). Это критически важно — все серверные расчёты дат используют этот часовой пояс. Интерфейс может отображать даты в локальном часовом поясе пользователя, но сервер работает в едином согласованном поясе.

5. Баннер версии: Читает META-INF/projectforge-version.properties (сгенерированный Gradle) и логирует версию, временную метку сборки и хэш коммита git.

6. Запуск Spring Boot: Вызывает SpringApplication.run() с полностью настроенным контекстом приложения.

Обработка ошибок при запуске

Конфликт портов: Перехватывает ConnectorStartFailedException — если порт 8080 уже занят, считывает существующий PID из temp/projectforge.pid и выводит понятное сообщение: «Порт 8080 уже используется процессом PID=XXXXX». Не выполняет повторные попытки и не переключает порты автоматически — администратор должен разрешить конфликт вручную.

Корректное завершение: Регистрирует хук завершения через SecurityShutdown, который очищает конфиденциальные данные (пароли, токены, ключи шифрования) из памяти при завершении JVM. Это мера защиты на случай дампа кучи JVM после завершения — конфиденциальные данные должны быть обнулены.

Иерархия классов

ProjectForgeApplication extends SpringBootServletInitializer — это позволяет развёртывать приложение как традиционный WAR-файл в контейнере сервлетов (Tomcat, Jetty) в дополнение к режиму встроенного сервера. Метод configure() переопределён для установки источников на ProjectForgeApplication.class, сообщая контейнеру сервлетов, какой класс конфигурации Spring загружать.

Аннотация @ServletComponentScan необходима для совместимости с Wicket — Wicket регистрирует свой фильтр через аннотацию @WebFilter, а не через FilterRegistrationBean от Spring Boot, и без @ServletComponentScan фильтр Wicket никогда не был бы обнаружен.

История Git

КоммитЧто изменилось
868d6abb7Авторские права 2025→2026
63081666fАвторские права 2024→2025
b6092df09Авторские права 2023→2024
ab45d51faАвторские права 2001-2022→2001-2023
5f7ef41b8Авторские права 2021→2022
ceb63e8a1Авторские права 2001-2021
7c79f192Авторские права 2020
dd5ca38acНачальный коммит — ProjectForgeApplication создан как точка входа Spring Boot с разбором аргументов, настройкой директорий и конфигурацией часового пояса.
9ebb88522Создание проекта — этот файл был частью начальной структуры проекта.
Почему два режима запуска? Класс поддерживает как java -jar (встроенный Tomcat через Spring Boot), так и WAR-развёртывание (внешний Tomcat через SpringBootServletInitializer). WAR-режим используется организациями, у которых уже есть инфраструктура Tomcat и которые предпочитают развёртывать ProjectForge вместе с другими веб-приложениями. JAR-режим проще для разработки и Docker-развёртывания.