EN · DE · RU · FR · ES

#1874: Version.java

projectforge-common/src/main/java/org/projectforge/Version.java Класс домена — пакет org.projectforge, projectforge-common/src/main/java/org/projectforge/Version.java 314 строк · 223 кода · 63 комментария · 28 пустых
Класс представления и сравнения семантических номеров версий. Разбирает строки версий в форматах #.#.#.# с необязательными суффиксами b{beta}, rc{release-candidate} и -SNAPSHOT. Реализует Comparable<Version> для корректного упорядочивания (релиз > RC > бета, с числовым под-сравнением). Используется во всем ProjectForge для проверок совместимости плагинов и версионирования миграций базы данных.

Архитектура

Импорты

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

Version implements Comparable<Version>, Serializable

Компоненты версии

КомпонентПолеЗначение по умолчанию/неустановленноеПример
Мажорный релизmajorRelease03.5.4.2 → major=3
Минорный релизminorRelease03.5.4.2 → minor=5
Уровень патчаpatchLevel03.5.4.2 → patch=4
Номер сборкиbuildNumber03.5.4.2 → build=2
Бета-версияbetaVersionInteger.MAX_VALUE (не бета)3.5b2 → beta=2
RC-версияreleaseCandidateVersionInteger.MAX_VALUE (не RC)3.5rc1 → rc=1
Флаг снапшотаsnapshotfalse3.5-SNAPSHOT

Формат разбора

Конструктор строк принимает следующие шаблоны (регистронезависимые для суффиксов):

Логика сравнения (compareTo)

Сравнение следует строгой иерархии:

  1. Мажорный релиз → Минорный релиз → Уровень патча → Номер сборки (числовое сравнение)
  2. Релиз vs Пре-релиз: Если версии различаются по статусу пре-релиза:
    • Обычный релиз ВЫШЕ, чем RC
    • RC ВЫШЕ, чем бета
    • Бета НИЖЕ, чем обычный релиз
  3. Если обе RC: сравнить номера RC-версий
  4. Если обе бета: сравнить номера бета-версий

Этот порядок гарантирует: 3.5b1 < 3.5rc1 < 3.5 — критически важно для определения необходимости миграции БД или обновления плагина.

Особая обработка: Заполнитель Gradle

Метод parseInt() обнаруживает неразвернутый токен Gradle "gradle.version" и обрабатывает его как 0, записывая предупреждение. Это обрабатывает случай, когда информация о версии компилируется в JAR во время сборки, а свойство версии Gradle еще не разрешено (например, при тестовых запусках в IDE).

Формат toString()

Использование Integer.MAX_VALUE в качестве сигнального значения для "не бета/RC" — элегантное проектное решение. Оно гарантирует, что при числовом сравнении не-бета версия всегда сравнивается как более высокая, чем любая бета-версия (поскольку MAX_VALUE — это максимально возможное целое число), при этом все еще допуская прямое числовое сравнение, когда обе версии бета/RC.
Метод compareTo НЕ учитывает флаг снапшота при упорядочивании. Две версии, различающиеся только статусом снапшота (например, "3.5" vs "3.5-SNAPSHOT"), будут сравниваться как равные. Это может быть намеренно — снапшоты указывают на метаданные времени сборки, а не на семантические различия версий.

История Git

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.