it-swarm-pt.tech

Qual é o objetivo do META-INF?

Em Java, muitas vezes você vê uma pasta META-INF contendo alguns arquivos meta. Qual é o objetivo desta pasta e o que posso colocar lá?

267
Kristian

De um modo geral, você não deve colocar nada no META-INF. Em vez disso, você deve confiar no que você usa para empacotar seu JAR. Essa é uma das áreas em que acredito que o Ant realmente se destaca: especificar atributos de manifesto do arquivo JAR. É muito fácil dizer algo como:

<jar ...>
    <manifest>
        <attribute name="Main-Class" value="MyApplication"/>
    </manifest>
</jar>

Pelo menos, acho que é fácil ... :-)

O ponto é que o META-INF deve ser considerado um diretório interno Java meta. Não mexa com isso! Quaisquer arquivos que você deseja incluir em seu JAR devem ser colocados em algum outro subdiretório ou na raiz do próprio JAR.

61
Daniel Spiewak

De a especificação oficial do arquivo JAR (o link vai para a versão Java7, mas o texto não mudou desde pelo menos a v1.3):

O diretório META-INF

Os seguintes arquivos/diretórios no diretório META-INF são reconhecidos e interpretados pela plataforma Java 2 para configurar aplicativos, extensões, carregadores de classes e serviços:

  • MANIFEST.MF

O arquivo de manifesto usado para definir dados relacionados à extensão e ao pacote.

  • INDEX.LIST

Este arquivo é gerado pela nova opção "-i" da ferramenta jar, que contém informações de localização para pacotes definidos em um aplicativo ou extensão. Ele faz parte da implementação do JarIndex e é usado pelos carregadores de classes para acelerar o processo de carregamento da classe.

  • x.SF

O arquivo de assinatura para o arquivo JAR. 'x' representa o nome do arquivo base.

  • x.DSA

O arquivo de bloco de assinatura associado ao arquivo de assinatura com o mesmo nome de arquivo de base. Este arquivo armazena a assinatura digital do arquivo de assinatura correspondente.

  • services/

Este diretório armazena todos os arquivos de configuração do provedor de serviços.

157
aku

Eu notei que algumas bibliotecas Java começaram a usar o META-INF como um diretório no qual incluir arquivos de configuração que deveriam ser empacotados e incluídos no CLASSPATH junto com os JARs. Por exemplo, o Spring permite importar arquivos XML que estão no caminho de classe usando:

<import resource="classpath:/META-INF/cxf/cxf.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extensions-*.xml" />

Neste exemplo, estou citando diretamente do Guia do Usuário do Apache CXF . Em um projeto em que trabalhei, no qual tivemos que permitir vários níveis de configuração via Spring, seguimos essa convenção e colocamos nossos arquivos de configuração no META-INF.

Quando reflito sobre essa decisão, não sei exatamente o que seria errado simplesmente incluir os arquivos de configuração em um pacote Java específico, em vez de em META-INF. Mas parece ser um padrão emergente de fato; ou isso, ou um anti-padrão emergente :-)

25
user38748

A pasta META-INF é o lar do arquivo MANIFEST.MF . Este arquivo contém metadados sobre o conteúdo do JAR. Por exemplo, há uma entrada chamada Main-Class que especifica o nome da classe Java com a static main () para arquivos JAR executáveis.

10
Brian Matthews

Você também pode colocar recursos estáticos lá.

No exemplo:

META-INF/resources/button.jpg 

e obtê-los no contêiner web3.0 via

http://localhost/myapp/button.jpg

> Leia mais

O /META-INF/MANIFEST.MF tem um significado especial:

  1. Se você executar um jar usando Java -jar myjar.jar org.myserver.MyMainClass, poderá mover a definição da classe principal para o jar para reduzir a chamada para Java -jar myjar.jar.
  2. Você pode definir Metainformations para pacotes se você usar Java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Você pode fazer referência aos certificados digitais que você gosta de usar no modo Applet/Webstart.
8
Peter Rader

Apenas para incluir as informações aqui, no caso de um arquivo WAR, o arquivo META-INF/MANIFEST.MF fornece ao desenvolvedor um recurso para iniciar uma verificação de tempo de implementação pelo contêiner, o que garante que o contêiner possa localizar todas as classes de sua aplicação. depende de. Isso garante que, caso você tenha perdido um JAR, não tenha que esperar até que seu aplicativo seja executado em tempo de execução para perceber que está faltando.

4
sasuke

Somando-se às informações aqui, o META-INF é uma pasta especial que o ClassLoader trata de forma diferente das outras pastas no jar. Os elementos aninhados dentro da pasta META-INF não são misturados com os elementos externos a ela.

Pense nisso como outra raiz. Do método Enumerator<URL> ClassLoader#getSystemResources(String path) et al perspective:

Quando o caminho fornecido começa com "META-INF", o método procura por recursos aninhados dentro das pastas META-INF de todos os jars no caminho da classe.

Quando o caminho fornecido não inicia com "META-INF", o método procura por recursos em todas as outras pastas (fora do META-INF) de todos os jars e diretórios no caminho da classe.

Se você souber sobre outro nome de pasta que o método getSystemResources trata especialmente, por favor, comente sobre ele.

4
Readren

Eu estive pensando sobre esse problema recentemente. Não parece haver qualquer restrição ao uso do META-INF. Há certas restrições, é claro, sobre a necessidade de colocar o manifesto lá, mas não parece haver nenhuma proibição de colocar outras coisas ali.

Por que isso acontece?

O caso do cxf pode ser legítimo. Aqui está outro lugar onde este não-padrão é recomendado para contornar um bug desagradável no JBoss-ws que impede a validação do lado do servidor contra o esquema de um wsdl.

http://community.jboss.org/message/570377#570377

Mas realmente não parece haver nenhum padrão, qualquer não-tu-não. Normalmente, essas coisas são muito rigorosamente definidas, mas, por algum motivo, parece que não há padrões aqui. Ímpar. Parece que o META-INF se tornou um lugar importante para qualquer configuração necessária que não possa ser facilmente tratada de outra maneira.

4
Steve Cohen

Se você estiver usando o JPA1, talvez tenha que soltar um arquivo persistence.xml que especifica o nome de uma unidade de persistência que você pode querer usar. Uma unidade de persistência fornece uma maneira conveniente de especificar um conjunto de arquivos de metadados e classes e jars que contêm todas as classes para serem persistentes em um agrupamento.

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Veja mais aqui: http://www.datanucleus.org/products/datanucleus/jpa/emf.html

3
f0ster

META-INF em Maven

No Maven, a pasta META-INF é entendida por causa do Layout de Diretório Padrão que por convenção de nome empacota seus recursos de projeto dentro de JARs : quaisquer diretórios ou arquivos colocados dentro do diretório $ {basedir}/src/main/resources são empacotados em seu JAR com a mesma estrutura exata começando na base do JAR. A Pasta $ {basedir}/src/main/resources/META-INF geralmente contém . Propriedades arquivos enquanto o jar contém um gerado MANIFEST.MF , pom.properties , o pom.xml , entre outros arquivos. Também frameworks como Spring usam classpath:/META-INF/resources/ para servir recursos da web. Para mais informações, consulte Como eu adiciono recursos ao meu Projeto Maven

3
EliuX

Todas as respostas estão corretas. Meta-inf tem muitos propósitos. Além disso, aqui está um exemplo sobre como usar o contêiner do Tomcat.

Vá para Documento do Tomcat e marque " Implementação Padrão> copyXML " attribute.

A descrição está abaixo.

Defina como true se você quiser que um descritor XML de contexto integrado dentro do aplicativo (localizado em /META-INF/context.xml) seja copiado para o xmlBase do Host proprietário quando o aplicativo for implementado. Nos começos subseqüentes, o descritor XML do contexto copiado será usado em preferência a qualquer descritor XML de contexto incorporado dentro do aplicativo, mesmo que o descritor embutido no aplicativo seja mais recente. O valor do sinalizador é padronizado como falso. Observe se o atributo deployXML do Host proprietário for falso ou se o atributo copyXML do Host proprietário for true, esse atributo não terá efeito.

1
Tugrul

Você tem o arquivo MANIFEST.MF dentro da sua pasta META-INF. Você pode definir dependências opcionais ou externas que você deve ter acesso.

exemplo:

Considere que você implantou seu aplicativo e seu contêiner (em tempo de execução) descobriu que seu aplicativo requer uma versão mais recente de uma biblioteca que não está dentro da pasta lib; nesse caso, se você tiver definido a versão mais nova opcional em MANIFEST.MF, seu aplicativo consulte a dependência de lá (e não irá falhar).

Source: Head First Jsp & Servlet

0
Prateek Joshi