Especialização em web com interfaces ricas Sistema de Pacotes e Armazenamento Prof. Fabrízzio Alphonsus A. M. N. Soares [email protected] [email protected] Instituto de Informática Universidade Federal de Goiás Aula 10 1 de junho de 2012 Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 1/42 Pacotes Usamos pacotes para organizar as classes semelhantes. Pacotes, a grosso modo, são apenas pastas ou diretórios do sistema operacional onde ficam armazenados os arquivos fonte de Java e são essenciais para o conceito de encapsulamento, no qual são dados níveis de acesso as classes. Java possui um pacote padrão que é utilizado quando programamos, mesmo embora não seja recomendado pela Sun usá-lo. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 2/42 Criando pacotes Muitos compiladores criam automaticamente os pacotes como uma forma eficaz de organização, mas a criação de pacote pode ser feita diretamente no sistema operacional. Basta que criemos uma pasta e lhe demos um nome. Após isso, devemos gravar todos os arquivos fonte de java dentro desta pasta. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 3/42 Definir pacotes I Agora que já possuímos a pasta que será nosso pacote, devemos definir em nossa classe a qual pacote ela pertence. Isso é feito pela palavra reservada package. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 4/42 Definir pacotes II Package deve ser a primeira linha de comando a ser compilada de nossa classe. Portanto, se tivéssemos criado uma pasta chamada ufg e fossemos criar uma classe nesta pasta (pacote), o começo de nosso código seria: package ufg; Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 5/42 Importar pacotes I Java possui vários pacotes com outros pacotes internos e várias classes já prontas para serem utilizadas. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 6/42 Importar pacotes II Dentre os pacotes Java podemos determinar dois grandes pacotes: o pacote java, que possui as classes padrões para o funcionamento do algoritmo; e o pacote javax, que possui pacotes de extensão que fornecem classes e objetos que implementam ainda mais o pacote java. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 7/42 Importar pacotes III Exemplo: o pacote AWT (Abstract Windowing Toolkit) possui as classes necessárias para se criar um ambiente gráfico API (Janelas) e está fortemente ligado as funções nativas do Sistema Operacional, ou seja, ele pertence ao pacote java. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 8/42 Importar pacotes IV Mas, o pacote SWING não é ligado fortemente as funções nativas do Sistema Operacional, mas as funções do AWT, ou seja, SWING complementa o AWT, portanto SWING faz parte do pacote de extensão javax. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 9/42 Importar pacotes V Para utilizar as milhares de classes contidas nos inúmeros pacotes de Java devemos ou nos referenciar diretamente a classe ou importá-la. Para importar um pacote usamos o comando import. Para separar um pacote de seu sub-pacote usamos um ponto (como no acesso a membros de classe). Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 10/42 Importar pacotes VI Ao importarmos um pacote podemos utilizar um coringa, o asterisco (*). O asterísco serve para importar todos os sub-pacotes e classes do pacote que está definido. Ex.: import java.awt.*;. Isso importará todos os sub-pacotes pertencentes ao pacote AWT. Ou podemos definir diretamente qual pacote desejamos. Ex.: import javax.swing.JOptionPane;. Isso irá importar apenas o sub-pacote JOptionPane do pacote SWING. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 11/42 Importar pacotes VII A diferença entre as duas formas de importação de pacotes é o consumo de recursos do computador. Como o asterisco importa todos os sub-pacotes, o consumo de memória será alto e, muito provavelmente, não usaremos todas as classes de todos os pacotes importados. Por isso, o recomendado é sempre importar apenas o pacote que será utilizado. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 12/42 Importar pacotes VIII Exemplo: 1 2 3 4 5 6 7 8 9 10 package ufg; import javax.swing.JOptionPane; public class Mensagem { public static void main (String args[]){ JOptionPane.showMessageDialog(null, "Bem vindo ao mundo de Java!"); } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 13/42 Importar pacotes IX Mas atenção! Como você colocou a classe em um pacote, alguns requisitos são necessários para usa-lo: 1 Você deve invocar a classe de fora do diretório que representa o pacote; 2 Caso você queira invocar a classe a partir de qualquer diretório, você deverá indicar o diretório onde encontra-se o pacote ou diretório na variável CLASSPATH do ambiente ou do parâmetro do java; 3 Você sempre deverá invocar a classe pelo seu nome completo, ou seja, nome_do_pacote.nome_da_classe. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 14/42 Empacotando seu aplicativo em armazenamentos I Em diversos sistemas operacionais os programas compilados são empacotados em um formato binário monolítico que é representado por arquivos de extensão “.exe” e “.dll” no Windows e “.so” em S.O. como o linux. Ressalta-se que no linux, a ausência de extensão em alguns casos “também pode” caracterizar que o programa é um binário executável. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 15/42 Empacotando seu aplicativo em armazenamentos II Estes binários pode conter todas as funções e classes do programa compilado além das instruções necessárias para o programa ser iniciado. É importante lembrar que estes tipos de binários são construídos para uma determinada arquitetura e sistema operacional. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 16/42 Empacotando seu aplicativo em armazenamentos III O Java não possui um conceito de programa “.exe” ou equivalente de outros sistemas operacionais. O Java trata como binário executável todo e qualquer arquivo “.class” que possua uma função main com a sintaxe: 1 2 3 public static void main(String args[]){ } Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 17/42 Empacotando seu aplicativo em armazenamentos IV Assim, um programa constituído de muitas classes não possuirá um único arquivo e sim vários. Porém, quando você iniciar o programa somente uma das classes será indicada para a JVM executa-la. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 18/42 Pacotes I Como um programa em Java pode conter vários arquivos uma tarefa interessante é empacota-los, criando assim uma estrutura hierárquica de diretórios para dividir seu aplicativo. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 19/42 Pacotes II Um inconveniente que ainda persiste é o fato de que seu aplicativo fica exposto em diretórios, sujeito a algum usuário excluir ou modificar um ou outro arquivo e prejudicando o bom funcionamento do seu aplicativo. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 20/42 Pacotes III Para resolver este inconveniente, o Java possui um mecanismo de armazenamento intitulado Java Archive (JAR). Os arquivos JAR são chamados por alguns programadores java de executáveis do java. Porém, isto não é uma verdade. Os arquivos JAR são na verdade arquivos compactados com o algoritmo pkzip e possuem uma estrutura interna planejada para a JVM trata-lo. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 21/42 Java Archive I Java Archive (JAR) é um arquivo compactado usado para distribuir um conjunto de classes Java, um aplicativo java, ou outros itens como imagens, XMLs, entre outros. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 22/42 Java Archive II É usado para armazenar classes compiladas e metadados associados que podem constituir um programa. Arquivos jar podem ser criados e extraídos usando o utilitário “jar” da JDK. Ferramentas de compressão (como o Winzip) também podem criar arquivos .jar. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 23/42 Java Archive III Na especificação desse tipo de formato JAR, é obrigatório a presença do arquivo do tipo manifesto em um diretório METAINF. Esse arquivo pode definir dados do seu arquivo JAR, como versão, cabeçalho, etc. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 24/42 Java Archive IV O formato JAR também ganhou popularidade ao ser conhecido como o executável de Java. Para tal, isto é, tornar seu JAR como um executável, deve-se adicionar o atributo Main-Class ao manifesto. O valor desse atributo deve ser o nome completo da classe, que contenha o método public staticvoid main(String[] args), isto é, é necessário informar qual a porta de entrada de sua aplicação. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 25/42 Criando arquivos JAR I Para demonstrar como criar um JAR iremos utilizar um exemplo. Para esse exemplo iremos precisar de alguns códigos .java para que possamos gerar o pacote da nossa aplicação, como o intuito é explicar como gerar o arquivo .jar, os códigos não serão comentados, são apenas dois códigos simples para esta demonstração. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 26/42 Criando arquivos JAR II Vamos criar um diretório qualquer para o nosso projeto, eu criei um diretório chamado “jarfiles”, (que de agora em diante será chamado de diretório RAIZ) e dentro dele criaremos mais alguns diretórios: src - diretório onde colocaremos nossos arquivos fonte bin - diretório onde colocaremos os arquivos compilados Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 27/42 Criando arquivos JAR III E dentro do diretorio “src” criaremos mais um diretório chamado “init”, é um nome qualquer apenas para mostrar como fazer para rodar um arquivo que estará dentro dele, e para demostrar que é possível criar diversos diretórios e colocá-los todos no nosso .jar. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 28/42 Criando arquivos JAR IV Agora que já temos os diretórios iremos criar duas classes dentro do diretório “src/init”, são elas: OlaMundo.java 1 2 3 4 5 6 package init; public class OlaMundo { public void falaOla(){ System.out.println("Olá mundo cruel!"); } } UsaOlaMundo.java Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 29/42 Criando arquivos JAR V 1 2 3 4 5 6 7 package init; public class UsaOlaMundo { public static void main(String[] args){ OlaMundo om = new OlaMundo(); om.falaOla(); } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 30/42 Criando arquivos JAR VI Agora vamos compilar nossos códigos java para dentro do diretório bin, para isso uma vez estando dentro do diretório RAIZ no terminal, vamos digitar: 1 javac src/init/*.java -d bin/ Isso fará com que os arquivos .java que estão em /src/init/ sejam compilados e colocados em /bin/init/. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 31/42 Criando arquivos JAR VII Para ver se está tudo ok iremos rodar nossa aplicação, primeiro entramos no diretório “bin”, e então executamos nossa aplicação com o comando: 1 java init.UsaOlaMundo Se tudo der certo veremos a mensagem “Olá mundo cruel!” na tela. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 32/42 Criando arquivos JAR VIII Para criar o arquivo .jar iremos fazer uso do comando “jar”, existem diversas opções que podemos passar para o comando jar, iremos nesse artigo fazer uso das seguintes: c - cria um novo arquivo v - modo “verbose”, mostra na tela o que está acontecendo f ARQUIVO_JAR - especifica o nome que queremos para o arquivo .jar m ARQUIVO_DE_MANIFESTO - inclui o arquivo informado como arquivo de manifesto (veremos isso na segunda parte da explicação) Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 33/42 Criando arquivos JAR IX Ainda dentro do diretório bin, tudo que temos que fazer para criar nosso .jar é executar o comando: 1 jar cvf Ola.jar init/* Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 34/42 Criando arquivos JAR X Pronto, com isso temos nossa aplicação agora dentro do arquivo Ola.jar, vamos então executá-la, para fazer isso devemos informar no classpath onde está nossa aplicação (no caso a classe init.UsaOlaMundo), Podemos tanto colocar o arquivo Ola.jar no nosso classpath quanto informar esse parâmetro no momento da execução como no comando abaixo: 1 java -classpath Ola.jar init.UsaOlaMundo Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 35/42 Criando arquivos JAR XI Se olharem dentro do arquivo Ola.jar (abram ele com um compactador qualquer como Winzip ou Winrar, pois ele é apenas um arquivo compactado sem utilizar compressão, isso mesmo, você poderia ter simplesmente criado um arquivo .zip ou .rar com o seu compactador preferido informando a ele para não utilizar compactação, apenas adicionar os arquivos e depois renomear o mesmo para .jar que ainda assim funcionaria. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 36/42 Criando arquivos JAR XII Enfim, voltando a aplicação, veja que dentro dele temos um diretório META-INF contendo o arquivo MANIFEST.MF, pois bem, esse arquivo contém informações sobre a nossa aplicação, como não criamos esse arquivo, ele tem apenas algumas informações básica, vamos então criar o nosso MANIFEST.MF e ver em que ele pode nos ajudar. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 37/42 Criando arquivos JAR XIII Quando executamos nossa aplicação vocês se lembram que tivemos que infomar no classpath o arquivo Ola.jar para que fosse possível rodar a classe “init.UsaOlaMundo”, agora iremos criar um arquivo de manifesto para que seja possível rodar nossa aplicação informando apenas o arquivo Ola.jar e não mais o nome da classe e pacote (init.UsaOlaMundo). Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 38/42 Criando arquivos JAR XIV Para isso criaremos o nosso próprio MANIFEST.MF, salvem o código abaixo em um arquivo chamado MANIFEST.MT dentro do diretório “bin”. 1 2 3 Manifest-Version: 1.0 Created-By: Nome do Criador Main-Class: init.UsaOlaMundo O mais importante aqui é a última linha “Main-Class: init.OlaMundo”, aqui eu digo qual classe será chamada quando o arquivo Ola.jar for executado. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 39/42 Criando arquivos JAR XV vamos apagar o nosso antigo Ola.jar e criar um novo, agora informando qual arquivo de manifesto que iremos utilizar, Para isso basta mudar um pouco nosso comando jar como no exemplo abaixo: 1 jar cvfm Ola.jar MANIFEST.MF init/* Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 40/42 Criando arquivos JAR XVI Agora para rodar nossa aplicação precisamos apenas do comando abaixo: 1 java -jar Ola.jar E o arquivo MANIFEST.MF se encarrega de dizer a virtual machine qual a classe que queremos que seja executada. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 41/42 Criando arquivos JAR XVII Observações: Para que o Jar seja executado no linux, é conveniente atribuir a permissão de execução ao seu arquivo .jar com o comando chmod +x <nome_do_arquivo.jar>. No Windows é interessante definir para os arquivos .jar que quem executa o arquivo é o programa javaw.exe. Assim, basta um clique duplo e seu programa será executado. Porém, se for um programa sem janelas gráficas, o resultado não será como o esperado. Prof. Fabrízzio Alphonsus A. M. N. Soares | Sistema de Pacotes e Armazenamento 42/42