Classpath nao funciona nem a pau (jar / jdbc)

17 respostas
P

Ja dei uma pesquisada no forum e parece ser a coisa mais facil do mundo. Os usuarios mais avancados sempre respondem : “coloque no seu classpath”. Mas as perguntas continuam pq isso nao funciona de jeito nenhum para algumas pessoas. Para ver se alguem consegue responder de uma forma definitiva isso, eu vou tentar colocar da forma mais completa possivel o problema:

Estou usando o jdbc do firebird. Adicionei os 6 arquivos “.jar” ao meu projeto no Jbuilder e funcionou tudo.

Se eu mando o jbuilder gerar um .jar do meu projeto incluindo os do firebird e outros (como o ireport) ele gera um arquivao, mas tambem funciona. (ambos com o classpath em branco, no maquina do cliente, que so tem a jre).

Se eu gero o .jar so com as classes da minha aplicacao, com o comando “jar -cvmf manifest.txt sistema.jar sistema”, é gerado um arquivo pequeno.

Somente para testar eu deixei o sistema dependente apenas da jdbc do firebird. Neste caso, bastaria ter os arquivos do jdbc no classpath do cliente.

Levei este arquivo para o cliente, onde tem a jre 1.5, uma pasta com o jdbc do firebird. Configurei o classpath assim:
CLASSPATH=.;%JAVA_HOME%;c:\jdbc\jdbc2_0-stdext.jar;c:\jdbc\firebirdsql.jar;c:\jdbc\lib\mini-j2ee.jar;c:\jdbc\lib\mini-concurrent.jar;c:\jdbc\lib\log4j-core.jar;c:\jdbc\lib\jaas.jar

executo o sistema com:

java -jar sistema.jar

Ele abre, mas quando tenta acessar os dados, da este erro:
java.sql.SQLException: org.firebirdsql.jdbc.FBDriver at …

Este erro é o mesmo que acontece quando nao incluo as libs no projeto ao compilar pela IDE, o que faz parecer que o sistema nao esta encontrando os arquivos .jar que estao no classpath.

Se eu pego estes 6 arquivos do jdbc e coloco em jre\lib\ext tudo funciona bem. Mas uma prova de que o problema e com a classpath. Ja configurei na forma do XP, ja tentei no autoexec.bat e criando um bat para chamar a aplicacao, setando antes a classpath (set classpath=…).

Fiz a mesma coisa no linux: o arquivao que inclui as libs externas funciona sem classpath; o arquivo so com o sistema funciona se colocar os jar em jre/lib/ext; e o arquivo jar so com o sistema junto com o classpath (que deveria ser a forma normal) tambem nao funciona no linux.
O classpath do linux eu setei assim:

export CLASSPATH=.:$CLASSPATH:/mnt/hda1/jdbc/jdbc2_0-stdext.jar:/mnt/hda1/jdbc/firebirdsql.jar:/mnt/hda1/jdbc/lib/mini-j2ee.jar:/mnt/hda1/jdbc/lib/mini-concurrent.jar:/mnt/hda1/jdbc/lib/log4j-core.jar:/mnt/hda1/jdbc/lib/jaas.jar

e conferi com export.

===============================

tudo que eu coloquei acima vale para outras libs externas, como o ireport.

===============================

sera que alguem, que ja tenha passado por isso, pode ajudar???

17 Respostas

diego2005

Aproveitando o seu tópico, vou deixa minha dúvida também, pois o meu classpath não funciona, da uma olhada como tá:

O JAVA_HOME ta assim:

JAVA_HOME=C:\Arquivos de programas\Java\jdk1.5.0_06

e o CLASSPATH assim:

CLASSPATH=.;%JAVA_HOME%;c:\

O que estou fazendo de errado???

Já li os tutorias aqui, mas esse tal de CLASSPATH não funciona mesmo.

Grato

Diego.

thiago.correa

Diego, o seu classpath tem que estar assim: %JAVA_HOME%\bin, você não deve ter lido com atenção os tutoriais.

Popoca, tente criar uma pasta lib no seu projeto e coloque lá todos os jars que a sua aplicação precisa, no seu projeto do jbuilder adicione ao classpath do projeto os jars que estão nesse lib, gere o jar e tente novamente, é para dar certo.

Era isso

P

thiago.correa:

Popoca, tente criar uma pasta lib no seu projeto e coloque lá todos os jars que a sua aplicação precisa, no seu projeto do jbuilder adicione ao classpath do projeto os jars que estão nesse lib, gere o jar e tente novamente, é para dar certo.

Era isso

Valeu Thiago, mas esta nao é a resposta para o problema. Talvez eu nao tenha deixado claro, mas eu ja consigo gerar um jar pelo jbuilder, que inclui todos os jars externos, que funciona em qualquer lugar, mesmo sem classpath.
Colocar os jars numa pasta lib da minha aplicacao nao funciona, a nao ser que eu descompacte todos esses jars no raiz do meu sistema, criando a arvore exata: org.firebird.jdbc… Dessa forma, eu tambem consigo gerar um jar manualmente, com tudo que o sistema precisa, levando para o cliente apenas o arquivao.jar que vai funcionar.

Mas o que eu quero é fazer o classpath funcionar, pq se o meu cliente ja tem dois outros sistemas que utilizam jdbc, ireport e outros componentes comuns a varios sistemas, ele nao deveria ficar com varias copias de jdbc e ireport, uma para cada sistema que chega na empresa dele. Bastaria uma, e todos os sistemas em java deveriam usar o classpath para acessar os jars do jdbc e ireport.

Mas como citei antes, eu nao consigo fazer o classpath funcionar de jeito nenhum aqui.

Quem ja conseguiu usar o classpath, por favor, deixe o seu comentario. acho que sera util pra muita gente.

diego2005

Cara, coloquei igual ta la no tutorial:

JAVA_HOME:
JAVA_HOME=c:\j2sdk1.4.0_01
CLASSPATH:
CLASSPATH=.;%JAVA_HOME%
PATH:
%PATH%;%JAVA_HOME%\bin

Também coloquei do jeito que você falou, mas não da certo de jeito nenhum…

P

diego2005:
Cara, coloquei igual ta la no tutorial:

JAVA_HOME:
JAVA_HOME=c:\j2sdk1.4.0_01
CLASSPATH:
CLASSPATH=.;%JAVA_HOME%
PATH:
%PATH%;%JAVA_HOME%\bin

Também coloquei do jeito que você falou, mas não da certo de jeito nenhum…

Diego, o que exatamente nao funciona? É quando voce tenta compilar, digitando javac programa.java, quando tenta rodar digitanda java programa, ou esta tentando usar um arquivo .jar junto com sua aplicaao?

Nao faça exatamente como no tutorial. Ali tem um exemplo mas vc deveria ter trocado o diretorio para a sua situacao, como disse que tinha feito antes:
JAVA_HOME=C:\Arquivos de programas\Java\jdk1.5.0_06
e deve colocar no final da sua PATH < ;%JAVA_HOME%\bin > sem os <>. Isso considerando que os seus arquivos executaveis do java java.exe, javac.exe,jar.exe,… estao em C:\Arquivos de programas\Java\jdk1.5.0_06\bin

diego2005

Então deixa eu explicar melhor, tenho uns programas exemplos dentro de c:\ e quero compilá-los, como deve ficar o meu JAVA_HOME, PATH, CLASSPATH??

Não consigo configurar, sempre que dou um javac Classe.class ele fala que o javac não é um comando interno.

Valeu…

P

Ok! Mande pesquisar no c: o arquivo javac.exe e poste aqui no forum o(s) diretorio(s) exato(s).

P

Bom, pessoal! Como eu tinha que resolver hoje de qualquer jeito, fiz um monte de experiencias e acho que cheguei a uma explicacao plausivel. Se algum veterano em Java discordar, coloque a sua opiniao.

consegui rodar o programa sem incluir os jars dos outros no meu jar, nem no diretorio do meu sistema com o comando:

java -classpath c:\jdbc\jdbc2_0-stdext.jar; c:\jdbc\firebirdsql.jar; c:\jdbc\lib\mini-j2ee.jar;c:\jdbc\lib\mini-concurrent.jar; c:\jdbc\lib\log4j-core.jar;c:\jdbc\lib\jaas.jar;sistema.jar sistema.Principal

Dessa forma funcionou. Notem que eu tive que colocar o sistema.jar como parametro do -classpath e chamei a classe principal direto. Fiz isso porque o comando java nao aceita -jar e -classpath juntos.

Taí a resposta. Se é para usar os jars de terceiros compartilhados por varios sistemas, esses sistemas nao poderao ser chamados pela opcao -jar. Coloquem o “.” no classpath e chamen o sistema pelo nome do pacote.ClassePrincipal.

coloquei a minha classpath entao, como:

CLASSPATH=.;%JAVA_HOME%;c:\jdbc\jdbc2_0-stdext.jar; c:\jdbc\firebirdsql.jar; c:\jdbc\lib\mini-j2ee.jar;c:\jdbc\lib\mini-concurrent.jar; c:\jdbc\lib\log4j-core.jar;c:\jdbc\lib\jaas.jar

e executei o meu jar (que so tem as minhas classes) com o comando java sistema.Principal

Funcionou tudo, inclusive colocando o ireport depois.

Valeu

diego2005

Pois é…+ o meu não funciiona de jeito nenhum :frowning:

Alguém pra me ajudar???

P

Diego, acho que nao viu essa minha mensagem acima?

Se voce disser onde fica o seu javac.exe, vai ficar claro qual deve ser a sua sua java_home, sua path e seu classpath.

Na java-home tem que ficar o diretorio onde fica o bin do jdk. Na path tem que ter esse diretorio ate o bin, e o classpath fica com pelo menos o “.”.

P

A gente nao precisa ficar alterando a classpath sempre. Ela provavelmente tem um limite de tamanho e nao vai dar para adicionar todos os jars extras de todos os sistemas.

Cheguei a uma boa forma de usar:

CLASSPATH=.;%JAVA_HOME%

e para cada sistema eu criei um arquivo “.bat” que configura a classpath apenas enquanto usa o sistema sem alterar a vaiavel do ambiente.

o nome_do_sistema.bat contem:
rem -------------------------------------
SET CLASSPATH=.;%JAVA_HOME%;todos_os_jars_que_o_sist_usa.jar
cd
java sistema.Principal
rem -------------------------------------

no linux seria: nome_do_sistema.sh
rem -----------------------------------------
export CLASSPATH=.:$JAVA_HOME:todos_os_jars_que_o_sist_usa.jar
cd
java sistema.Principal
rem -------------------------------------

Quando vc sair do sistema, sua variavel estara como antes.

diego2005

Cara, olha só com está as 3 variáveis:

Path:

%JAVA_HOME%\bin

Java_home:

JAVA_HOME=C:\Arquivos de programas\Java\jdk1.5.0_06

ClassPath:

CLASSPATH=.;%JAVA_HOME%;c:\

O que estou fazendo de errado???

P

Pra mim, esta tudo certo. Notei que numa mensagem anterior voce colocou como exemplo javac classe.class. javac deve ser usado com classe.java. o arquivo class deve ser digitado junto com java sem a extensao para rodar o programa. Mas o erro de que nao e um programa interno é mesmo pq nao esta localizando o executavel.

Faça alguns testes:

  • digite o caminho completo e veja se funciona:

C:\Arquivos de programas\Java\jdk1.5.0_06\bin\javac Classe.java

C:\Arquivos de programas\Java\jdk1.5.0_06\bin\java Classe

  • no prompt de comando, digite set e veja se as variaveis existem e estao como voce quer.
diego2005

Cara, tentei de tudo aqui, + nada da certo, o mais perto do que eu cheguei foi entrar no diretório …\bin e digitar:

javac C:\Classe.java

até aki parece que deu certo, mas na hora que eu faço:

java C:\Classe

ele da um erro:

"Exception in thread “main” java.lang.NoClassDefFoundError: C:\Literais

Mesmo assim valeu pela ajuda…se alguém tiver mais alguma sugestão para esse problema…

dreamspeaker

Sua classe se chama “Classe” ou se chama “Literais”?

E, popoca, na sua 1a msg vc disse que dava um SQLException. Esse stacktrace do erro nao diz nada de interessante?

diego2005

Desculpa, eu coloquei errado é Literais…

B

Olá a todos,

sei que esta thread é antiga mas estou tendo o mesmo problema do post original: Meu classpath não funciona.
Já havia tentado de tudo, só funcionava no Eclipse mas não quando eu colocava um jar de dependência no CLASSPATH. Cheguei a mesma conclusão:

Exemplo:

java -classpath $CLASSPATH:/home/borysmb/scripts/tlntpl_monitor.jar com.mycompany.services.tools.talentpool.report.engine.TalentPoolReportEngine

a forma acima é a mais correta, porque mexer com o CLASSPATH do environment inteiro é besteira e pode dar conflito com os jars do JRE.

vou colocar esta dica no meu blog também:

http://programmingspot.blogspot.com/

Criado 27 de maio de 2006
Ultima resposta 8 de jan. de 2008
Respostas 17
Participantes 5