Ir para o conteúdo

Jars e Manifest.mf

Jars

Os leitores mais familiarizados com a aplicações Java deverão já ter-se cruzado com aplicações ou bibliotecas distribuídas em ficheiros Jar, cuja extensão é .jar. Estes ficheiros não são mais que ficheiros compactados, usando uma versão do formato zip, que contêm as classes e recursos necessários para a execução da nossa aplicação. São possíveis de abrir com, virtualmente, qualquer aplicação que suporte o formato zip, embora algum cuidado deva ser exercido quando se pretende modificar um destes ficheiros com outras aplicações que não as disponíveis no JDK ou na plataforma Java.

Os ficheiros Jar não são, no entanto, destinados apenas a distribuir aplicações, e sendo uma variação do formato zip é possível usá-los para outros propósitos, podendo servir como simples contentores de dados, conter outros ficheiros Jar, outras aplicações, enfim, podem ser usados da mesma forma que o formato zip é usado. Embora a taxa de compressão possa ficar aquém das expectativas.

Manifest.mf

Uma das modificações introduzidas no formato zip, e a mais importante no que toca aos programadores que usam Java, é a adição de um ficheiro especial que controla o objectivo do Jar. Dado que os ficheiros Jar podem ser usados para qualquer objectivo, é importante que, quando usados para aplicações ou bibliotecas, alguns parâmetros sejam adicionadas e permitam o controlo das acções que são aplicadas aos ficheiros.

Assim, todos os ficheiros Jar possuem no seu interior um ficheiro de texto, chamado MANIFEST.MF, dentro de uma pasta chamada META-INF. Estes dois nomes são importantes e precisam ser respeitados. O ficheiro MANIFEST.MF agrega informação sobre os packages e recursos contidos, bem como sobre as classes usadas e, caso se aplique, a classe que contém o método main. Desta forma é possível criar um Jar que seja automaticamente executado pela JVM.

Formato e conteúdo do Manifest.mf

Um ficheiro MANIFEST.MF simples, criado automaticamente durante a criação do Jar, não terá mais que uma linha de texto indicando a versão da especificação à qual o MANIFEST.MF corresponde:

Manifest-Version: 1.0

Neste ficheiro, todo o conteúdo é definido em pares de chave-valor, onde o nome da chave é separado do valor por dois pontos, :. A informação pode ser relevante à classe que contém o método main, como foi já referido, ou a outros ficheiro contidos mas a criação automática do MANIFEST.MF não toma qualquer acções sobre esses ficheiros e não cria qualquer entrada correspondente ao conteúdo do Jar, além da versão do MANIFEST.MF.

Problemas associados a ficheiros Jar e MANIFEST.MF

A criação dos ficheiros supra citados acarreta alguns problemas, derivados em parte da leituras erradas das especificações e das diferenças entre os formatos e sistemas operativos.

Assim, um dos problemas será a quebra de linhas longas dentro do MANIFEST.MF, que não deverá conter mais de 68 caracteres. Infelizmente alguns programadores consideram que as linhas referentes ao Classpath, uma das possíveis chaves do ficheiro, deverão quebrar depois de um caminho completo para um ficheiro. Tal escolha irá impedir a JVM de ler correctamente o ficheiro Jar. Outro problema são aplicações como o WinZip, que ao serem usadas para editar os ficheiros Jar podem converter ficheiros que contêm maiúsculas para minúsculas. Este problema é importante porque, se o objectivo de uma aplicação Java é correr em várias plataformas, há plataformas que destingem ficheiros escritos em maiúsculas de ficheiros escritos em minúsculas. Se os nomes são alterados, para essas plataformas, passa a corresponder a ficheiros diferentes.

Foram também detectadas JVM em alguns dispositivos móveis que não efectuam a correcta leitura do conteúdo do ficheiro MANIFEST.MF. Este é um problema que poderá significar a existência de erros nos testes usados para certificar partes da tecnologia Java, neste caso a componente JME.