Percebi que os arquivos JAR, WAR e EAR têm um MANIFEST.MF
arquivo na META-INF
pasta.
Qual é a utilidade do MANIFEST.MF
arquivo? O que todas as coisas podem ser especificadas neste arquivo?
Percebi que os arquivos JAR, WAR e EAR têm um MANIFEST.MF
arquivo na META-INF
pasta.
Qual é a utilidade do MANIFEST.MF
arquivo? O que todas as coisas podem ser especificadas neste arquivo?
Respostas:
O conteúdo do arquivo Manifest em um arquivo JAR criado com a versão 1.0 do Java Development Kit é o seguinte.
Manifest-Version: 1.0
Todas as entradas são como pares nome-valor. O nome de um cabeçalho é separado de seu valor por dois pontos. O manifesto padrão mostra que está em conformidade com a versão 1.0 da especificação do manifesto. O manifesto também pode conter informações sobre os outros arquivos empacotados no arquivo. Exatamente quais informações do arquivo são registradas no manifesto dependerá do uso pretendido para o arquivo JAR. O arquivo de manifesto padrão não faz suposições sobre quais informações ele deve registrar sobre outros arquivos, portanto, sua única linha contém dados apenas sobre si mesmo. Cabeçalhos de Manifesto de Finalidade Especial
Dependendo da função pretendida do arquivo JAR, o manifesto padrão pode precisar ser modificado. Se o arquivo JAR for criado apenas para fins de arquivamento, o arquivo MANIFEST.MF será inútil. A maioria dos usos dos arquivos JAR vai além do simples arquivamento e compactação e requer que informações especiais estejam no arquivo de manifesto. Abaixo, estão resumidas breves descrições dos cabeçalhos que são necessários para algumas funções de arquivo JAR de propósito especial
Aplicativos agrupados como arquivos JAR: Se um aplicativo estiver agrupado em um arquivo JAR, a Java Virtual Machine precisa ser informada qual é o ponto de entrada para o aplicativo. Um ponto de entrada é qualquer classe com um método public static void main (String [] args). Essas informações são fornecidas no cabeçalho da classe principal, que tem a forma geral:
Main-Class: classname
O valor classname deve ser substituído pelo ponto de entrada do aplicativo.
Extensões de download: as extensões de download são arquivos JAR referenciados pelos arquivos de manifesto de outros arquivos JAR. Em uma situação típica, um miniaplicativo será empacotado em um arquivo JAR cujo manifesto faz referência a um arquivo JAR (ou vários arquivos JAR) que servirá como uma extensão para os propósitos desse miniaplicativo. As extensões podem fazer referência umas às outras da mesma maneira. As extensões de download são especificadas no campo de cabeçalho Class-Path no arquivo de manifesto de um miniaplicativo, aplicativo ou outra extensão. Um cabeçalho Class-Path pode ter a seguinte aparência, por exemplo:
Class-Path: servlet.jar infobus.jar acme/beans.jar
Com esse cabeçalho, as classes nos arquivos servlet.jar, infobus.jar e acme / beans.jar servirão como extensões para os propósitos do miniaplicativo ou aplicativo. Os URLs no cabeçalho Class-Path são fornecidos em relação ao URL do arquivo JAR do miniaplicativo ou aplicativo.
Selagem do pacote: Um pacote dentro de um arquivo JAR pode ser opcionalmente lacrado, o que significa que todas as classes definidas nesse pacote devem ser arquivadas no mesmo arquivo JAR. Um pacote pode ser lacrado para garantir a consistência da versão entre as classes do software ou como medida de segurança. Para selar um pacote, um cabeçalho de Nome precisa ser adicionado ao pacote, seguido por um cabeçalho Selado, semelhante a este:
Name: myCompany/myPackage/
Sealed: true
O valor do cabeçalho do Nome é o nome do caminho relativo do pacote. Observe que termina com '/' para distingui-lo de um nome de arquivo. Quaisquer cabeçalhos após um cabeçalho de Nome, sem nenhuma linha em branco intermediária, se aplicam ao arquivo ou pacote especificado no cabeçalho de Nome. No exemplo acima, como o cabeçalho Sealed ocorre após o cabeçalho Name: myCompany / myPackage, sem linhas em branco entre eles, o cabeçalho Sealed será interpretado como se aplicando (somente) ao pacote myCompany / myPackage.
Versão de pacote: a especificação de versão de pacote define vários cabeçalhos de manifesto para conter informações de versão. Um conjunto desses cabeçalhos pode ser atribuído a cada pacote. Os cabeçalhos de controle de versão devem aparecer diretamente abaixo do cabeçalho Nome do pacote. Este exemplo mostra todos os cabeçalhos de controle de versão:
Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."
Manifest.MF contém informações sobre os arquivos contidos no arquivo JAR.
Sempre que um arquivo JAR é criado, um arquivo manifest.mf padrão é criado dentro da pasta META-INF e contém as entradas padrão como estas:
Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
Estas são entradas como pares “cabeçalho: valor”. O primeiro especifica a versão do manifesto e o segundo especifica a versão JDK com a qual o arquivo JAR é criado.
Cabeçalho da classe principal: quando um arquivo JAR é usado para agrupar um aplicativo em um pacote, precisamos especificar a classe que atende a um ponto de entrada do aplicativo. Fornecemos essas informações usando o cabeçalho 'Main-Class' do arquivo de manifesto,
Classe principal: {nome de classe totalmente qualificado}
O valor 'Main-Class' aqui é a classe que possui o método principal. Depois de especificar essa entrada, podemos executar o arquivo JAR para executar o aplicativo.
Cabeçalho Class-Path: Na maioria das vezes, precisamos acessar os outros arquivos JAR das classes empacotadas dentro do arquivo JAR do aplicativo. Isso pode ser feito fornecendo seus caminhos totalmente qualificados no arquivo de manifesto usando o cabeçalho 'Class-Path',
Class-Path: {jar1-name jar2-name directory-name / jar3-name}
Este cabeçalho pode ser usado para especificar os arquivos JAR externos na mesma rede local e não dentro do JAR atual.
Cabeçalhos relacionados à versão do pacote: quando o arquivo JAR é usado para a versão do pacote, os seguintes cabeçalhos são usados conforme especificado pela especificação da linguagem Java:
Headers in a manifest
Header | Definition
-------------------------------------------------------------------
Name | The name of the specification.
Specification-Title | The title of the specification.
Specification-Version | The version of the specification.
Specification-Vendor | The vendor of the specification.
Implementation-Title | The title of the implementation.
Implementation-Version | The build number of the implementation.
Implementation-Vendor | The vendor of the implementation.
Cabeçalhos relacionados à vedação de pacotes:
Também podemos especificar se algum pacote específico dentro de um arquivo JAR deve ser lacrado, o que significa que todas as classes definidas nesse pacote devem ser arquivadas no mesmo arquivo JAR. Isso pode ser especificado com a ajuda do cabeçalho 'Selado',
Nome: {package / some-package /} lacrado: true
Aqui, o nome do pacote deve terminar com '/'.
Aumentando a segurança com arquivos de manifesto:
Podemos usar entradas de arquivos de manifesto para garantir a segurança do aplicativo da web ou applet que empacota com os diferentes atributos como 'Permissões', 'Codebae', 'Nome do aplicativo', 'Somente confiável' e muitos mais.
Pasta META-INF:
Esta pasta é onde reside o arquivo de manifesto. Além disso, pode conter mais arquivos contendo metadados sobre o aplicativo. Por exemplo, em um arquivo JAR do módulo EJB, esta pasta contém o descritor de implementação EJB para o módulo EJB junto com o arquivo de manifesto para o JAR. Além disso, ele contém o arquivo xml que contém o mapeamento de referências EJB abstratas para recursos de contêiner concretos do servidor de aplicativos no qual será executado.
Referência:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html