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等)在META-INF目录下都有一个MANIFEST.MF文件。该文件包含了一组属性,用于描述这个特定的包。例如:

当您的应用程序有多个JAR依赖时,您的类路径中会有多个MANIFEST.MF文件。它们都位于相同的位置:META-INF/MANIFEST.MF。在运行时经常需要遍历所有文件并根据名称查找属性。

jcabi-manifests可以通过一行代码实现这一点。

让我们来看看为什么你希望从清单文件中读取属性,并在低级别上它是如何工作的。

当您打包一个库甚至一个Web应用程序时,最好在其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哈希值。它们是从每次页面点击时部署的WAR包的MANIFEST.MF中获取的。

尽管这可能被视为一种不良做法(参见Jez Humble和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