Compreendendo o arquivo de manifesto JAR

Compreendendo o arquivo de manifesto JAR

1. Introdução

Um Java Archive (JAR) é descrito por seu arquivo de manifesto. Este artigo explora seus muitos recursos, incluindo adicionar atribuição, tornar o JAR executável e incorporar informações de versão.

Vamos começar, porém, com uma revisão rápida do que é um arquivo de manifesto.

2. O arquivo de manifesto

O arquivo de manifesto é denominadoMANIFEST.MF e está localizado no diretórioMETA-INF no JAR. É simplesmentea list of key and value pairs, called headers or attributes, grouped into sections.

Essesheaders fornecem metadados que nos ajudam a descrever aspectos de nosso JAR, como as versões dos pacotes, qual classe de aplicativo executar, o caminho de classe, material de assinatura e muito mais.

3. Adicionar um arquivo de manifesto

3.1. O Manifesto Padrão

Um arquivo de manifesto é adicionado automaticamente sempre que nóscreate a JAR.

Por exemplo, se construirmos um JAR no OpenJDK 11:

jar cf MyJar.jar classes/

Produz um arquivo de manifesto muito simples:

Manifest-Version: 1.0
Created-By: 11.0.3 (AdoptOpenJDK)

3.2. Um Manifesto Personalizado

Ou, podemos especificar nosso próprio arquivo de manifesto.

Por exemplo, digamos que temos um arquivo de manifesto personalizado chamadomanifest.txt:

Built-By: example

Podemos incluir este arquivo ejarmerge it with the default manifest file quando usarmos a opçãom:

jar cfm MyJar.jar manifest.txt classes/

Em seguida, o arquivo de manifesto resultante é:

Manifest-Version: 1.0
Built-By: example
Created-By: 11.0.3 (AdoptOpenJDK)

3.3. Maven

Agora, o conteúdo do arquivo de manifesto padrãochange depending on which tools we use.

Por exemplo, o Maven adiciona alguns cabeçalhos extras:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.3.9
Built-By: example
Build-Jdk: 11.0.3

Na verdade, podemos personalizar esses cabeçalhos em nosso pom.

Digamos, por exemplo, que queremos indicar por quem o JAR foi criado e o pacote:


    org.apache.maven.plugins
    maven-jar-plugin
    3.1.2
    
        
            
                com.example.java
            
            
                example
            
        
    

Isso produz um arquivo de manifesto com cabeçalhospackageecreated-by personalizados:

Manifest-Version: 1.0
Build-Jdk-Spec: 11
Package: com.example.java
Created-By: example

Consultethe Maven JAR plugin documentation para uma lista completa das opções.

4. Cabeçalhos

Um cabeçalho deve seguir um determinado formato e ser separado por uma nova linha:

key1: value1
Key2: value2

A valid header must have a space between the colon and the value. Outro ponto importante está lámust be a new line at the end of the file. Caso contrário, o último cabeçalho será ignorado.

Vejamos alguns dos cabeçalhos padrão despecificatione alguns cabeçalhos personalizados comuns.

4.1. Cabeçalhos Principais

Os cabeçalhos principais geralmente fornecem informações gerais:

  • Manifest-Version: a versão da especificação

  • Created-By: a versão da ferramenta e o fornecedor que criou o arquivo de manifesto

  • Multi-Release: setrue, então este é umMulti-Release Jar

  • Built-By: este cabeçalho personalizado fornece o nome do usuário que criou o arquivo de manifesto

4.2. Ponto de entrada e caminho de classe

Se nosso JAR contiver um aplicativo executável, podemos especificar o ponto de entrada. Da mesma forma, podemos fornecer oclasspath. Ao fazer isso, evitamos precisar especificá-lo quando queremos executá-lo.

  • Main-Class: o pacote e o nome da classe com um método principal (sem extensão .class)

  • Class-Path: uma lista separada por espaço de caminhos relativos para bibliotecas ou recursos

Por exemplo, se o ponto de entrada do nosso aplicativo estiver emApplication.classe usar bibliotecas e recursos, podemos adicionar os cabeçalhos necessários:

Main-Class: com.example.Application
Class-Path: core.jar lib/ properties/

O classpath incluicore.jare todos os arquivos nos diretórioslibeproperties. These assets are loaded relative to where the JAR is executed and not from within the JAR itself. Em outras palavras, eles devem existir fora do JAR.

4.3. Versão da embalagem e selagem

Esses cabeçalhos padrão descrevem os pacotes no JAR.

  • Name: o pacote

  • Implementation-Build-Date: a data de construção para a implementação

  • Implementation-Title: o título da implementação

  • Implementation-Vendor: o fornecedor para a implementação

  • Implementation-Version: a versão de implementação

  • Specification-Title: o título para a especificação

  • Specification-Vendor: o fornecedor da especificação

  • Specification-Version: a versão da especificação

  • Sealed: se verdadeiro, todas as classes do pacote vêm do mesmo JAR (o padrão é falso)

Por exemplo, encontramos esses cabeçalhos de manifesto no driver do MySQL Connector / JJAR. Eles descrevem a versão da especificação JDBC que o JAR atende, bem como a versão do próprio driver:

Specification-Title: JDBC
Specification-Version: 4.2
Specification-Vendor: Oracle Corporation
Implementation-Title: MySQL Connector/J
Implementation-Version: 8.0.16
Implementation-Vendor: Oracle

4.4. Frasco Assinado

Podemos assinar digitalmente nosso JAR para adicionar segurança e verificação extras. Embora esse processo esteja fora do escopo deste artigo,doing so adds standard headers showing each signed class and its encoded signature to the manifest file. Por favor, consulte a documentaçãoJAR signing para mais detalhes.

4.5. OSGI

É comum ver também oheaders for OSGI bundles: personalizado

  • Bundle-Name: título

  • Bundle-SymbolicName: um identificador único

  • Bundle-Version: versão

  • Import-Package: pacotes e versões das quais o pacote depende

  • Export-Package: pacotes de pacotes e versões disponíveis para uso

Consulte nosso artigoIntroduction to OSGI para saber mais sobre os pacotes OSGI.

5. Seções

Existem dois tipos de seções em um arquivo de manifesto, principal e por entrada. Headers that appear in the main section apply to everything in the JAR. Enquantoheaders that appear in the per-entry sections only apply to the named package or class.

Além disso, um cabeçalho que aparece em uma seção por entrada substitui o mesmo cabeçalho na seção principal. É comum que as seções por entrada contenham informações sobre versões e vedação de pacotes, além de assinatura digital.

Vejamos um exemplo simples de uma seção por entrada:

Implementation-Title: example-examples
Implementation-Version: 1.0.1
Implementation-Vendor: example
Sealed: true

Name: com/example/utils/
Sealed: false

A seção principal na parte superior selou todos os pacotes dentro do nosso JAR. No entanto, o pacotecom.example.utils não está lacrado pela seção por entrada.

6. Conclusão

Este artigo fornece uma visão geral de como adicionar um arquivo de manifesto a um JAR, como usar seções e alguns cabeçalhos comuns. A estrutura do arquivo de manifesto nos permite fornecer informações padrão, como informações de versão.

No entanto, sua flexibilidade nos permite definir qualquer informação que acharmos relevante para descrever o conteúdo de nossos JARs.