RSS

Classpath, entendendo o que é e para que serve

23 nov

Introdução

Neste tutorial vamos mostrar o que de fato é e para que serve o famoso CLASSPATH, essa variável de ambiente que tanto causa problemas (principalmente para os principiantes em Java) na hora de compilar os programas. Aqui você irá aprender como configurar, quais são os erros que acontecem se é mal configurado e, logicamente, como resolver tais problemas. O CLASSPATH (ou "a" CLASSPATH, se preferirem) é uma das 3 variáveis de ambiente importantes do Java. Essa variável é importante tanto para compilar quanto para executar o seu programa, já que especifica onde estão armazenados os arquivos e bibliotecas necessários, tanto para a compilação, quanto para a execução. E porquê essa variável existe? A gente podia muito bem copiar tudo que é necessário para o diretório da nossa aplicação! Isso contradiz um dos principais benefícios do java, que é o reaproveitamento de código. Sem contar que seria uma terrível perda de espaço, e criaria uma dificuldade para atualizar as versões das bibliotecas (como acontece quando você tem a mesma .dll em vários diretórios).

Porquê falam tanto dele?

Para entender isso, vamos analizar o que acontece desde o momento da instalação do JDK até o momento da compilação de um programa. Logo após o ambiente de desenvolvimento Java ter sido instalado no computador, a CLASSPATH não contém valor algum, ou seja, seu conteúdo é vazio. Ao tentar compilar algum programa, o javac (java compiler, compilador java) verifica o seu conteúdo, e se não tiver valor algum, ele irá usar apenas as bibliotecas padrões, as quais estão localizadas dentro do diretório de instalação do JDK. O mesmo processo é realizado na hora de executar o programa, porém desta vez pela JVM. Caso a CLASSPATH contenha algum valor, no caso nomes de diretórios ou arquivos .jar, os valores contidos serão utilizados como base para tentar encontrar as classes necessárias para o programa. O que muitas vezes acontece é que, devido a uma má configuração dessa variável, tanto o compilador quanto o interpretador não conseguem encontrar os arquivos necessários, terminando com uma mensagem de erro.

Porquê esses erros acontecem?

A situação mais comum é quando alguns diretórios necessários estão faltando no CLASSPATH, ou quando apontam para lugares inválidos ou incompletos. Vale lembrar que a CLASSPATH em si não se altera sozinha, e muitos menos o compilador ou interpretador a alteram (a menos que especificado na linha de comando). Quem faz isso é sempre o usuário, seja alterando os valores manualmente ou devido a alguma ação tomada, como por exemplo a instalação de um programa, o qual pode modificar a variável sem lhe perguntar se pode ou não. Antes de passarmos para a parte de explicação e solução dos problemas que possam vir a ocorrer, vejamos como deve ser feita a correta manutenção e configuração da CLASSPATH. Caso, em algum momento seja necessário a alteração desta diretiva, é muito importante cuidar os seguintes detalhes:

  • Diretórios e arquivos de classes são separados pelo caracter dois-pontos ( : ) em ambiente UNIX, ou pelo caracter ponto-e-vírgula ( ; ) em ambiente Windows.
  • Sempre, mas sempre mesmo, inclua o diretório atual na configuração. Isso é especificado pelo caracter ponto ( . ). Isto indica que o compilador (e a JVM) também devem considerar o diretório atual para procurarem as classes.
  • Digamos que você tenha criado um pacote ( package ) chamado com.meu.pacote, que esta localizado na estrutura de diretório /home/fulano/java/com/meu/pacote. Nesse caso, CLASSPATH deverá apontar para /home/fulano/java, e não para o caminho completo ( /home/fulano/java/com/meu/pacote ). Eis aqui a razão disso: ao rodar ou compilar seu programa, o Java irá verificar as entradas em CLASSPATH, e procurar pelo diretório com/meu/pacote em cada entrada. Se for incluído o caminho completo os arquivos nào serão encontrados, pois o caminho procurado irá ser /home/fulano/java/com/meu/pacote/com/meu/pacote. Note que o nome do pacote é acresentado ao final do nome do diretório.
  • Caso o seu pacote tenha sido colocado dentro de um arquivo .jar, o CLASSPATH deverá conter o caminho completo até o arquivo .jar, incluindo o nome do mesmo. Por exemplo, se foi criado um arquivo chamado meupacote.jar, deverá haver uma entrada no CLASSPATH na forma /diretorio/para/o/pacote/meupacote.jar. Note que neste caso incluímos o nome completo, e nao apenas o diretório base.

    jar, jar, jar. Mas afinal, o que são esses jar?

    JAR significa Java ARchive, e é simplesmente um arquivo ZIP normal, com uma extensão diferente apenas (sim, você pode usar o WinZIP, unzip, pkzip e similar es para descompactar os .jar). Estes arquivos são usados para facilitar a distribuição de pacotes e manter a simplicidade na hora de configurar os ambientes de desnvolvimento, uma vez que é possível colocar todos seus pacotes ( conjunto de classes ) dentro de um único arquivo JAR. Os arquivos JAR devem conter a estrutura exata do seu pacote, caso contrário o Java não irá encontrar as bibliotecas. Por exemplo, usando como exemplo o pacote com/meu/pacote ( o qual, obviamente, se chama com.meu.pacote ), podemos criar um arquivo JAR chamado meupacote.jar usando o comando

     

    1. jar cvf meupacote.jar com/ 

    jar cvf meupacote.jar com/
    . Note que voce precisa estar um diretório abaixo de "com/" para dar o comando. Para maiores informações, apenas digite jar na linha de comando para ver as opções existentes. Um arquivo JAR pode guardar outro tipo de informações, como seals e qual a classe principal que deve ser executada deste jar. Não entraremos nestes assuntos aqui.

    Exemplos de configuração

    Ok, vamos ver agora algumas situações de configuração do CLASSPATH, tanto como os possíveis problemas que possam vir a ocorrer.

  • Configuração inicial: Bom, caso o CLASSPATH esteja vazio, sem valor algum, o Java irá procurar as bibliotecas básicas no diretório de instalação do JDK, porém é recomendável que você altere o valor para incluir ao menos o ponto ( . ), pois há a possibilidade de algum outro programa, externo, alterar essa diretiva e não incluir o ponto pra você, portando vamos nos certificar que ele estará lá. Para isso, em ambiente UNIX rodando o Bash, utilize o comando :

     

    1. export CLASSPATH=.:$CLASSPATH 

    export CLASSPATH=.:$CLASSPATH
    (note que é recomendável colocar isso em /etc/profile ou ~/.bash_profile para não precisar redigitar o comando toda hora que relogar no sistema ). No Windows, até a versão 98, edite o autoexec.bat e inclua

     

    1. SET CLASSPATH=.;%CLASSPATH% 

    SET CLASSPATH=.;%CLASSPATH%
    Nas versões mais recentes do Windows é necessário adicionar via painel de controle ( para maiores informações, veja o tutorial "Instalando e configurando o JDK no Windows", aqui no GUJ mesmo ).

  • Para adicionar novas entradas no CLASSPATH, simplesmente use o separador de campos ( dois-pontos em UNIX, ponto-e-vírgula no windows ) e coloque o novo valor. Por exemplo, digamos que queremos adionar o arquivo meupacote.jar ao CLASSPATH. Para isso, usando o meio de configuração relativo ao seu sistema operacional ( como descrito no item anterior ), o CLASSPATH ficará assim no UNIX:

     

    1. CLASSPATH=.:$CLASSPATH:/diretorio/onde/esta/o/meupacote.jar 

    CLASSPATH=.:$CLASSPATH:/diretorio/onde/esta/o/meupacote.jar
    e no Windows:

     

    1. CLASSPATH=.;%CLASSPATH%;c:\diretorio\onde\esta\o\meupacote.jar 

    CLASSPATH=.;%CLASSPATH%;c:\diretorio\onde\esta\o\meupacote.jar

  • Caso queira apontar para um diretório o funcionamento é o mesmo, ou seja, especifique o caminho completo até o diretório que deseja incluir na configuração, não esquecendo de separar cada um por dois-pontos ou ponto-e-vírgula ( em UNIX ou Windows, respectivamente ).

    Possíveis problemas

    Aqui estão listados os problemas mais comuns que talvez você venha a encontrar.

  • Ao compilar um programa, o erro "MeuPrograma.java: package com.meu.pacote does not exist". Isso acontece por que o arquivo MeuPrograma.java contém uma chamada a import com.meu.pacote.*; , porém este pacote não esta no CLASSPATH. Para resolver isso, inclua o caminho completo ate o arquivo .jar ou o diretório base desse pacote, conforme mostrado na secão anterior.
  • Ao tentar rodar um programa, o erro "Exception in thread "main" java.lang.NoClassDefFoundError: MeuPrograma" ocorre. Nesse caso a falta do diretório atual (especificado pelo caracter de ponto) não esta configurado no CLASSPATH. Para resolver, simplesmente o adicione conforme exemplificado na seção anterior, ou pelos tutoriais "Instalando e Configurado o JDK no Windows" e "Instalando e configurando o JDK no Linux", disponíveis aqui no GUJ.

    Conclusão

    Vimos aqui o que é e para que serve a variável de ambiente CLASSPATH, o que são arquivos JAR, como confiugurar o CLASSPATH e alguns possíveis erros que possam vir a ocorrer. Apesar de parecer complicado, a idéia por trás do CLASSPATH é bastante simples e simples de ser alterado seus valores, facilitando assim o desenvolvimento. Uma última dica é: cuide para não "sobrecarregar" o CLASSPATH com milhares de diretórios e arquivos, pois o Java pode reclamar que a variável esta muito grande. Caso tenha alguma dúvida ou sugestão, não hesite em postá-la no fórum, ficaremos muito felizes em lhe ajudar. Existem outras maneiras de você utilizar o classpath, que é utilizar -classpath path tanto na hora de compilar quanto na hora de executar. Abraços e até a próxima!

  • Anúncios
     
    Deixe um comentário

    Publicado por em 23/11/2009 em Estudos Java

     

    Deixe um comentário

    Preencha os seus dados abaixo ou clique em um ícone para log in:

    Logotipo do WordPress.com

    Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

    Imagem do Twitter

    Você está comentando utilizando sua conta Twitter. Sair / Alterar )

    Foto do Facebook

    Você está comentando utilizando sua conta Facebook. Sair / Alterar )

    Foto do Google+

    Você está comentando utilizando sua conta Google+. Sair / Alterar )

    Conectando a %s

     
    %d blogueiros gostam disto: