Version.java#.#.#.# с необязательными суффиксами b{beta}, rc{release-candidate} и -SNAPSHOT. Реализует Comparable<Version> для корректного упорядочивания (релиз > RC > бета, с числовым под-сравнением). Используется во всем ProjectForge для проверок совместимости плагинов и версионирования миграций базы данных.java.io.Serializable — Версии сериализуются (например, хранятся в записях версий плагинов в БД)org.apache.commons.lang3.StringUtils — Разделение строк для разбора составных частей версииorg.slf4j.Logger — Логирование через SLF4J (логирование ошибок для некорректных строк версий)Version implements Comparable<Version>, Serializable
</> в Kotlin| Компонент | Поле | Значение по умолчанию/неустановленное | Пример |
|---|---|---|---|
| Мажорный релиз | majorRelease | 0 | 3.5.4.2 → major=3 |
| Минорный релиз | minorRelease | 0 | 3.5.4.2 → minor=5 |
| Уровень патча | patchLevel | 0 | 3.5.4.2 → patch=4 |
| Номер сборки | buildNumber | 0 | 3.5.4.2 → build=2 |
| Бета-версия | betaVersion | Integer.MAX_VALUE (не бета) | 3.5b2 → beta=2 |
| RC-версия | releaseCandidateVersion | Integer.MAX_VALUE (не RC) | 3.5rc1 → rc=1 |
| Флаг снапшота | snapshot | false | 3.5-SNAPSHOT |
Конструктор строк принимает следующие шаблоны (регистронезависимые для суффиксов):
"3" → major=3"3.5" → major=3, minor=5"3.5.4" → major=3, minor=5, patch=4"3.5.4.2" → major=3, minor=5, patch=4, build=2"3.5b2" или "3.5b" → beta=2 или beta=0"3.5rc1" или "3.5rc" → rc=1 или rc=0"3.5-SNAPSHOT" или "3.5-snapshot" → snapshot=true"3.5.4.2b2-SNAPSHOT"Сравнение следует строгой иерархии:
Этот порядок гарантирует: 3.5b1 < 3.5rc1 < 3.5 — критически важно для определения необходимости миграции БД или обновления плагина.
Метод parseInt() обнаруживает неразвернутый токен Gradle "gradle.version" и обрабатывает его как 0, записывая предупреждение. Это обрабатывает случай, когда информация о версии компилируется в JAR во время сборки, а свойство версии Gradle еще не разрешено (например, при тестовых запусках в IDE).
3.5 (patch=0, build=0) → "3.5"3.5.4 (patch≠0, build=0) → "3.5.4"3.5.4.2 (все части) → "3.5.4.2"3.5b2 (бета) → "3.5b2"3.5rc1 (RC) → "3.5rc1"3.5-SNAPSHOT (снапшот) → "3.5-SNAPSHOT"Integer.MAX_VALUE в качестве сигнального значения для "не бета/RC" — элегантное проектное решение. Оно гарантирует, что при числовом сравнении не-бета версия всегда сравнивается как более высокая, чем любая бета-версия (поскольку MAX_VALUE — это максимально возможное целое число), при этом все еще допуская прямое числовое сравнение, когда обе версии бета/RC.compareTo НЕ учитывает флаг снапшота при упорядочивании. Две версии, различающиеся только статусом снапшота (например, "3.5" vs "3.5-SNAPSHOT"), будут сравниваться как равные. Это может быть намеренно — снапшоты указывают на метаданные времени сборки, а не на семантические различия версий.868d6abb7 2025 -> 2026 63081666f Заголовки исходных файлов: 2024 -> 2025. 0237d5eba Рефакторинг JSON-сериализации: введены IdOnlySerializer и IdsOnlySerializer. 6f7e0fbc7 Работа над миграциями в процессе... b6092df09 Авторские права 2023 -> 2024 ab45d51fa Авторские права 2001-2022 -> 2001-2023. 5f7ef41b8 Авторские права 2021 -> 2022 ceb63e8a1 Заголовок исходного кода: (C) 2001-2021.