Artigo Java Magazine 09 - Tira dúvidas
Artigo publicado pela Java Magazine.
Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML.
Tira-dúvidas
Como construir pacotes JAR e WAR
Uma das maiores dificuldades dos iniciantes na plataforma Java é construir corretamente os pacotes de suas aplicações para que sua execução ou deployment seja realizado com sucesso. Neste tira-dúvidas, são apresentados detalhadamente três dos principais pacotes Java.
Java é bem diferente de outras tecnologias populares no mercado, pela forma como aplicações são empacotadas para distribuição. Ao contrário dos ambientes focados no desenvolvimento de aplicações nativas para algum sistema operacional, não existe em Java o conceito de programa. Existem apenas classes independentes que interagem entre si – estas classes podem ser substituídas a qualquer momento, sem a necessidade de recompilação.
Empacotar uma aplicação Java é, portanto, um processo bastante diferente de instalar uma aplicação nativa. Especialmente no desenvolvimento J2EE, é importante entender como esse processo funciona, para evitar surpresas.
Programas, executáveis e pacotes
Linguagens de programação tradicionais estão intimamente ligadas ao conceito de programa. Por exemplo:
·Em Pascal temos a declaração program, que referencia uma ou mais units;
·Em C/C++ realizamos a linkedição de vários arquivos-objeto, derivados da compilação de arquivos .c ou .cpp, mas apenas um deles pode conter a função main que inicia o programa; Além disso, todas funções definidas em outros arquivos-objeto devem ser indicadas por declarações extern, geralmente reunidas em arquivos de cabeçalho (.h);
·Em Visual Basic temos um projeto que determina o formulário principal ou a sub-rotina principal para o executável resultante da compilação do projeto.
Em qualquer dessas linguagens, o resultado final da compilação e/ou linkedição é um único arquivo executável, um .exe no Windows. Este executável é basicamente uma imagem de memória do programa, carregada pelo sistema operacional e entregue para execução direta pelo processador. Mesmo quando são utilizadas bibliotecas dinâmicas (.dll no Windows) ou bibliotecas compartilhadas (.so no Linux e Unix), o conceito é mantido, pois o efeito desses arquivos é compartilhar uma região de código na memória entre vários processos/programas.
Sabemos que Java não realiza a etapa de linkedição para gerar um executável – apenas compila cada arquivo-fonte em arquivos de classe (.class). Sabemos também que, ao executar aplicações Java stand-alone, devemos indicar para a máquina virtual uma classe que contenha o método main; essa classe pode estar em qualquer diretório ou pacote indicado no classpath (na verdade, podemos ter várias classes com métodos main no classpath, sem que haja conflitos).
Uma vez que a classe desejada seja carregada pela JVM, outras são carregadas à medida que forem necessárias, não havendo nenhum vínculo rígido entre elas como o que existe entre as funções e bibliotecas inclusas em um executável. Podemos, a qualquer momento (inclusive depois de iniciado o programa!), acrescentar classes ao classpath, substituir classes já presentes (desde que não tenham sido ainda carregadas), ou mesmo obter novas classes pela rede, como é feito em Applets e em aplicações RMI.
Mas, e quanto aos pacotes da plataforma Java, não seriam análogos aos arquivos .exe e .dll? Não, os vários tipos de pacotes são apenas agrupamentos de arquivos .class e outros arquivos auxiliares (como .properties e .gif), para comodidade na distribuição de um aplicativo, ou para organizar logicamente arquivos relacionados. Na maioria dos casos é indiferente ter esses arquivos abertos em um diretório ou empacotados em um .jar. Os pacotes podem ser remontados pelo acréscimo, remoção ou substituição de arquivos pelo desenvolvedor ou usuário.
Essa é uma das grandes vantagens de Java: as aplicações deixam de ser "monolitos" rígidos, transformando-se em conjuntos modulares que podem ser montados e remontados em combinações diferentes para melhor atender às necessidades particulares de cada usuário.
Classes de exemplo
No decorrer deste artigo, serão construídos vários exemplos baseados em duas classes utilitárias, contendo métodos para formatação de texto. A classe FormataTexto garante que tenhamos iniciais maiúsculas em frases e nomes, enquanto que a classe FormataNumero insere um hífen no local correto em números de telefone com sete ou oito dígitos.
Classes utilitárias desse tipo são bastante utilizadas para a formatação de dados em relatórios ou em telas de entradas de dados, mas o objetivo aqui, claro, não é fornecer um framework robusto de formatação, mas sim exemplificar várias situações de construção de pacotes para bibliotecas e aplicações Java. Da mesma forma, os exemplos apresentados serão sempre os mais simples possíveis, pois o objetivo é entender como montar pacotes e não como construir as aplicações em si.
JARs
Um pacote JAR nada mais é do que um arquivo no formato ZIP, agrupando arquivos de classes e de propriedades, imagens e outros recursos utilizados pelas classes – os arquivos no JAR podem ou não estar compactados. Como tal, podemos criar, examinar e alterar pacotes JAR utilizando qualquer utilitário compatível com o formato ZIP, por exemplo os softwares livres Info-ZIP, e 7-Zip ou os populares sharewares WinZip e FilZip. Já que nenhum deles é padrão em todos os sistemas operacionais suportados por Java, o JDK fornece o utilitário jar, que será utilizado neste artigo.
As primeiras versões de Java utilizavam pacotes ZIP sem mudar a extensão (os leitores mais “dinossauros” certamente se lembram do pacote classes.zip que fornecia as APIs do Java 1.1 e 1.0.2). A única diferença entre um pacote JAR e um ZIP é que o primeiro contém, obrigatoriamente, um arquivo chamado META-INF/MANIFEST.MF (ao qual chamaremos apenas de “manifest” daqui em diante). O comando jar fornecido pelo JRE gera este arquivo com um conteúdo padrão, caso uma versão customizada não seja fornecida.
O manifest é um arquivo-texto semelhante a um arquivo de propriedades Java, contendo entradas na forma “chave: valor”, uma por linha. Sua finalidade é fornecer informações complementares para a JVM ou para o container responsável pela carga e execução do pacote – por exemplo IDEs visuais ou servidores de aplicações. No decorrer deste texto, serão vistas algumas das informações que podem ser inseridas dentro de um manifest.
As classes inclusas em um pacote JAR não são carregadas em bloco, mas sim individualmente, conforme a demanda, da mesma forma que seriam caso estivessem em arquivos .class individuais no sistema de arquivos. Por essa e outras razões, a estrutura de diretórios dentro do pacote deve obrigatoriamente refletir a estrutura de packages Java.
Por exemplo, o pacote "
[...] continue lendo...Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo