How to Read MANIFEST.MF Files

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Каждый пакет Java (JAR, WAR, EAR и т. д.) содержит файл MANIFEST.MF в каталоге META-INF. Файл содержит список атрибутов, которые описывают данный пакет. Например:

Когда ваше приложение имеет несколько зависимостей JAR, у вас есть несколько файлов MANIFEST.MF в вашем пути классов. Все они находятся в одном и том же месте: META-INF/MANIFEST.MF. Очень часто необходимо пройти через все из них во время выполнения и найти атрибут по его имени.

jcabi-manifests позволяет сделать это с одной командой.

Давайте посмотрим, почему вам может потребоваться читать атрибуты из файлов манифеста и как это работает на низком уровне.

При упаковке библиотеки или даже веб-приложения хорошей практикой является добавление атрибута к файлу MANIFEST.MF с именем версии пакета и номером сборки. В Maven для этого можно использовать плагин maven-jar-plugin (почти та же конфигурация для maven-war-plugin).

buildnumber-maven-plugin will help you to get ${buildNumber} from Git, SVN or Mercurial:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>buildnumber-maven-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>create</goal>
      </goals>
    </execution>
  </executions>
</plugin>

После всех этих манипуляций в вашем JAR файле MANIFEST.MF будет содержаться две дополнительные строки (помимо всех остальных строк, добавленных туда по умолчанию с помощью Maven).

Во время выполнения вы можете показать эти значения пользователю, чтобы помочь ему понять, с какой версией продукта он работает в данный момент.

Посмотрите на stateful.co, например. Внизу его главной страницы вы видите номер версии и хэш Git. Они извлекаются из MANIFEST.MF развернутого пакета WAR на каждый щелчок по странице.

Хотя это может считаться плохой практикой (см. Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation by Jez Humble and David Farley), иногда удобно упаковывать учетные данные для продакшн-среды непосредственно в архив JAR/WAR во время цикла непрерывной интеграции/доставки.

Например, вы можете закодировать данные для подключения к PostgreSQL прямо в MANIFEST.MF:

Позднее вы можете получить их во время выполнения, используя jcabi-manifests:

Если вы знаете о других полезных целях для MANIFEST.MF, дайте мне знать.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-28 at 15:46

sixnines availability badge   GitHub stars