Чтение версии Maven-артефакта во время выполнения

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того, чтобы узнать версию артефакта Maven во время работы приложения, вам потребуется Java-класс Properties. С его помощью можно загрузить файл pom.properties, который располагается по пути META-INF/maven/<groupId>/<artifactId>/:

Java
Скопировать код
Properties prop = new Properties();
prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(
    "META-INF/maven/com.yourgroup/yourartifact/pom.properties"));
String version = prop.getProperty("version");
System.out.println(version);

Следует заменить com.yourgroup и yourartifact на актуальные значения groupId и artifactId, для корректного извлечения версии.

Продвинутое использование версионной информации

Для получения доступа к версии, указанной в файле MANIFEST.MF JAR-архива, выполните следующие действия:

  1. В файле pom.xml установите значение true для параметра addDefaultImplementationEntries в настройках maven-jar-plugin:

    xml
    Скопировать код
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
            <archive>
                <manifest>
                    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                </manifest>
            </archive>
        </configuration>
    </plugin>
  2. Для получения версии используйте класс Package:

    Java
    Скопировать код
    Package pkg = MyClass.class.getPackage();
    String version = pkg.getImplementationVersion();
    System.out.println(version);

    Вместо MyClass укажите класс из вашего проекта.

Важные механизмы запасного плана и сознательность

Будьте готовы к ситуациям, когда версия недоступна. Это может случиться, например, в разработческой среде, где код не упаковывается в JAR:

Java
Скопировать код
String version = MyClass.class.getPackage().getImplementationVersion();
if (version == null) {
    version = "1.0.0-UNKNOWN";
}

И не забывайте о потокобезопасности при доступе к данным о версии в многопоточном приложении.

Использование Apache Maven Archiver для упаковки с наслаждением

Apache Maven Archiver значительно упрощает процесс упаковки и обеспечивает удобное управление версиями. Особенно это актуально при использовании его совместно с maven-assembly-plugin при особых требованиях к артефактам.

Визуализация

Процесс получения версии артефакта Maven можно представить как поиск в свитке мастер-ключей:

Markdown
Скопировать код
    🏷️ Связка ключей (Ваше Приложение)
          |
          ├── 🗝️ Ключ 1 (Артефакт A) – ID: 1.0
          |
          ├── 🗝️ Ключ 2 (Артефакт B) – ID: 2.3
          |
          └── 🗝️ Ключ 3 (Артефакт C) – **Где же ты, версия?**

С помощью класса Properties вы сможете считывать pom.properties из вашего JAR-архива:

Java
Скопировать код
Properties props = new Properties();
props.load(getClass().getClassLoader().getResourceAsStream("META-INF/maven/<groupId>/<artifactId>/pom.properties"));
String version = props.getProperty("version");

Таким образом, вы сможете установить точный версионный ID вашего приложения.

Работа с различными типами пакетов, например, war

Для war-пакетов в файл pom.xml необходимо добавить настройки maven-war-plugin, чтобы версия отображалась в MANIFEST.MF:

xml
Скопировать код
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            </manifest>
        </archive>
    </configuration>
</plugin>

Использование версии артефакта во время работы с Spring Boot

При использовании Spring Boot для доступа к информации о версии артефакта используется BuildProperties:

Java
Скопировать код
@Autowired
BuildProperties buildProperties;

public void printVersion() {
    System.out.println(buildProperties.getVersion());
}

Необходимо настроить Spring Boot Maven Plugin для создания информации о сборке.

Преимущества стандартов версионирования в экосистеме Spring

Spring Boot Actuator позволяет создать конечную точку /info, возвращающую версию приложения. Чтобы включить эту функцию, добавьте следующую строку в application.properties:

properties
Скопировать код
management.info.build.enabled=true

Совместное использование Lombok и Spring Boot упрощает инжектирование свойств.

Идентификация и предотвращение проблем при сборке Maven

Обратите внимание на конфликты плагинов при настройке сборки Maven. Используйте общие компоненты Maven для эффективного управления вашими плагинами.

Наслаждение динамическими конфигурациями с помощью OpenAPI и Spring Boot

Для веб-приложений, использующих OpenAPI и Spring Boot, можно динамически вставить версию в файлы конфигурации API. Это способствует улучшению обнаружения и документирования API.

Полезные материалы

  1. java – Получение версии артефакта Maven во время выполнения – Stack Overflow — Опыт сообщества в извлечении версии на выполнение.
  2. TheNEXUS | Сообщество проектов — Подходы к программному определению версий с Maven.
  3. Apache Maven Resources Plugin – Фильтрация — Инструкции по работе с фильтрацией и заменой placeholders в Maven.
  4. Apache Maven Archiver – Манифест — Создание манифеста jar-файла с версионной информацией.
  5. Готовые к производству функции — Использование Actuator Spring Boot для публикации информации о коммитах Git.
  6. JGit – Документация | Фонд Eclipse — Извлечение информации о коммитах из репозитория Git с помощью JGit.