Package

Já procurei sobre o assunto no fórum e não encontrei uma resposta clara. Sei que pacotes são usados para organizar as classes de um sistema até para não confrontar classes com o mesmo nome mas de desenvolvedores diferentes.
Gostaria de saber passo a passo como criar pacotes pois tentei e não consegui. Veja o que eu fiz.
Tenho uma classe chamada Links:

[code]package br.clbterere;

public class Links
{

}[/code]

pelo que eu sei criei uma classe chamada Link que pertence ao pacote br.clbterere. Se fosse chamá-la em outra classe uso:

[code]package br.clbterere;

public class Jogo
{
Links vlink = new Links;

}[/code]

não precisei importar o pacote br.clbterere.Link pois a classe Jogo pertence ao mesmo pacote!
Certo? não! aparece o erro de que a classe Link não foi encontrada! O que será? Tenho que criar a estrutura de diretórios brclbterere ou algo assim?

Gostaria de uma explicação passo a passo , desde a criação no arquivo fonte até na hora de compilar como um mini tutorial para servir para mim e outros usuários do fórum. Até o tutorial da Sun é muito vago.

Obrigado :wink:[/code]

EddiE,

Quando uma classe pertence a um pacote declaramos lá encima antes dos imports e declarações de classes package meupacote.

Apenas altere

Links vlink = new Links;

para

Links vlink = new Links();

Isto deve funcionar, acho que não há necessidade de escrever um mini-tutorial sobre packages mas ai vai tudo:

Crie uma hierarquia de pastas como deverá ser seu package, supomos que queremos criar o package org.guj.forum

nós teremos as pastas

±org
±-guj
±–forum

Suas classes devem ficar dentro desta pasta e a delcaração package deve vir antes de imports e declarações.

Eu fiz como você falou e não deu certo.

1- criei os diretórios

-br
--clbterere

2- no arquivo Validacao escrevi

[code] package br.clbterere;

public class Validacao
           {
            ...
           } [/code]

3- compilei a classe Validacao (Ok, nenhum problema)

4- no arquivo Jogo escrevi

[code] package br.clbterere;

import br.clbterere.Validacao;

public class Jogo
           {
             public static void consulta() throws Validacao
                       {
                       }
            ...
           } [/code]

5- compilei e aparece um erro:
symbol: class Validacao
location : package clbterere
import br.clbterere.Validacao;

symbol: class Validacao
location : class br.clbterere.Jogo
ClassNotFoundException para o método consulta() da classe Jogo

6 - se tiro o import aparece só o erro:
symbol: class Validacao
location : class br.clbterere.Jogo
ClassNotFoundException para o método consulta() da classe Jogo

o que será que estou fazendo de errado? Já esperimentei colocar Validacao() e não funcionou. O mesmo erro acontece para objetos da classe Validacao. :cry:

[/quote]

Voce nao pode importar br.clbterere.Validacao no arquivo Jogo.java, ja que ambos estao no mesmo pacote. O erro acontece que o java nao encontra do diretorio br.clbterere ( vc JA esta dentro dele ).

Se mesmo assim voce quiser importar, precisa ir no diretorio ANTES do “br” para compilar, assim funciona ( tipo, vc compila usando
javac br/clbterere/Jogo.java nesse caso, mas como ja estao no memso pacote, o lance eh nao dar o import e compilar dentro do diretorio certo ja )

Outra coisa: a indentacao que vc esta fazendo eh meio ruim…

Rafael

quando tiro o import o erro que dá é ClassNotFoundException

Qual a mensagem de erro exata agora? Vc esta dando throws Validacao, mas Validacao nao eh uma classe decendente de Throwable.

Rafael

o erro é:

  • cannot resolve symbol
    symbol: class Validacao
    location: class br.clbterere.Links

o código é da classe Links:

package br.clbterere;

public class Links{
          ...

          public static ResultSet consulta() throws Validacao, SQLException, ClassNotFoundException{
                    ...
                  }

          ...
        }

a classe Validacao é sim uma subclasse de throwable

Bom, no exemplo anterior pelo menos nao era. O ideal seria tambel chamar de ValidacaoException ao inves de apenas Validacao, pois isso facilita a identificacao do proposito.

Em relacao ao problema, por partes seria ter o diretorio “br/clbterere”. Entao nesse diretorio vc coloca o “Validacao.Java” e os outros arquivos que pertecam ao mesmo pacote. Em cada um destes arquivos deste pacote, coloque logo no inicio a declaracao

package br.clbterere; 

Por exemplo, se vc tiver os arquivos “Validacao.java”, “Links.java” e “Jogo.java”, sendo que todos devam fazer parte do pacote “br.clbterere”, vc adiciona a clausua “package br.clbterere;” em cada um dos arquivos.
Lembre-se que todos devem ficar no mesmo diretorio ( br/clbterere ).
Apos, nao eh necessario dar “import br.clbterere.AlgumaClasse” se vc estiver no diretorio “br/clbterere”, pois o javac entendera.

Dai eh so compilar normal… tipo,

javac *.java

Na hora de rodar, voce precisa sair do diretorio “br/clbterere” ( cd …/…/ ), pois como vc esta usando arquivos deste pacote, na hora de rodar vc precisa estar na hierarquia deles… entao eh soh executar

java br.clbterere.ProgramaPrincipal

onde “ProgramaPrincipal” eh o contem o “public static void main”. Se voce preferir, pode adicionar o path completo para “br/clbterere” no CLASSPATH ( por exemplo, export CLASSPATH=.:$CLASSPATH:/home/fulano/java/br/clbterere )… assim voce pode executar de qualquer lugar.

Rafael

[color=“darkblue”]Agora deu certo![/color] :lol:

Desde o começo estava fazendo tudo certo mais sempre dava o erro [color=“red”]Cannot Resolve Symbol[/color] quando eu compilava usando o comando javac links.java. Tentei compilar usando javac *.java como dito na resposta acima e tudo deu certo e compilou certinho. Seré que é um bug do java 1.4.1 ou algo que eu desconheça?
PS. quando eu compilava usando javac links.java já tinha compilado as classes ValidacaoExcecao.java e Jogo.java sem o menor problema.
PS2. quem estiver com dúvidas não esqueça de colocar os diretórios no Classpath

Muito obrigado pela ajuda e espero que esta conversa ajude outros usuários com o mesmo problema.

Você colocou o links.java com L maiúsculo, como está declarado na classe?

Se vc colocar javac Links.java, não tem razão de não compilar!

Não sei se tô falando besteira, mas…

Já passei por experiência parecida e tudo estava relacionado aos caminhos de compilação e execução.

Talvez ajude:

javac -d . SeuPacote.java
javac -classpath . SuaCLasse.java

Isto faz com o pacote seja gerado no mesmo diretório que vc está. Você não precisa criar cada diretório na mão.

java -cp . SuaClasse

Instancia (é esse o termo correto?) a classe com base no seu diretório atual, ou seja, busca os imports utilizando seu diretório atual, também, como caminho de classes.

Espero ter ajudado um pouco!! :roll:

Bom, pelo menos no DOS compilando com letra maiúscula ou minúscula não tem problema.
Se eu comprimir meu pacote usando o JAR, há algum problema de reconhecimento das classes ou tenho que usar a opção 0 (zero) para apenas agrupar os arquivos sem compactação?

Valeu pela solidariedade galera! :black: