Classe de pacotes diferentes não executando  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

Olá pessoal. Na minha máquina, eu tenho os seguintes diretórios:

/home/secreto/Java/Testes/app
/home/secreto/Java/Testes/util

No primeiro (app) tenho a seguinte classe (SomeApp.java):


No segundo (util) tenho a seguinte classe (BitUtils)


Para compilar, eu fui até dentro do diretório app e executei o comando: javac SomeApp.java -cp /home/secreto/Java/Testes/ Compilou normalmente.
OBS: Caso não use o parâmetro -cp com esse caminho que especifiquei, o compilador reclama de não ter achado a classe BitUtils.

O problema é que na hora de executar, está dando uma java.lang.NoClassDefFoundError. Para a execução, eu entro no diretório app (que é onde está a classe SomeApp.class que contém o método main) e dou o comando: java SomeApp -cp /home/secreto/Java/Testes/ , mas sempre gera esse erro de NoClassDefFoundError. Não sei onde posso estar errando. Também já tentei executar assim: java SomeApp e assim: java SomeApp -cp /home/secreto/Java/Testes/app e nada também.

Alguém sabe o que pode estar acontecendo?
Obrigado!

This message was edited 1 time. Last update was at 08/01/2010 18:58:13


Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
pmlm
GUJ Master

Membro desde: 20/04/2009 12:20:07
Mensagens: 1199
Localização: Portugal
Offline

Tens de indicar todo o caminho, com o nome da package.

Na directoria Testes:

java app.SomeApp
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

Olá pmlm. Isso de fato funcionou, mas, não há como executá-lo de dentro do diretório app? (ou de qualquer outro diretório da minha máquina).

Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
pmlm
GUJ Master

Membro desde: 20/04/2009 12:20:07
Mensagens: 1199
Localização: Portugal
Offline

java app.SomeApp -cp /home/secreto/Java/Testes/
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

ok, agora a última pergunta Tem como executar sem usar app.SomeApp ???

Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
pmlm
GUJ Master

Membro desde: 20/04/2009 12:20:07
Mensagens: 1199
Localização: Portugal
Offline

Não colocando na package app?
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

pmlm wrote:Não colocando na package app?


Não. Ainda na package app. Tem como executar o programa sem usar app.SomeApp?

Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

Algumas considerações que fazendo testes eu cheguei:
(pode ser óbvio mas não sabia disso)

Considerando a estrutura:



A) Comando-> javac:
* Não leva em consideração se tem ou não package declarado na classe;
* se tiver a opção "-d" junto ao classpath, o package poderá ser usado;
* O classpath não serve para localizar a classe a ser COMPILADA;
* O classpath na linha de comando/ambiente serve para informar onde estão as classes que SomeApp vai precisar;
* o pacote declarado na instrução import é usado pelo classpath para encontrar classes que a Classe a ser compilada irá precisar;

Situação 1: SomeApp não depende de outra classe:



Neste caso é possível fazer algo como:




Situação 2: SomeApp depende de util.BitUtils:
* o classpath tem que conter o caminho até o diretório raiz do pacote util, que neste caso é testes para que possa localizar util e depois a classe BitUtis



Neste caso o classpath de linha de comando/ambiente deverá conter o caminho até a classe util.BitUtils




Mas informando ao classPath onde util.BitUtils se encontra o código funcionará:







B) Comando-> java:

* Leva em consideração se tem package declarado na classe, e deve usar nomeDoPacote.NomeDaClasse
* O classpath na linha de comando/ambiente serve para informar onde estão a raiz dos pacotes que SomeApp vai precisar



Situação 1: classe a ser executada não tiver a instrução package e não usar nenhuma outra classe:
pode-se executar a classe diretamente no diretório que a classe.class se encontra:



Situação 2: classe a ser executada tiver a instrução package



- Tentar executar essa classe no diretório app dessa forma:


Dá exeção SomeApp java.lang.NoClassDefFoundError: SomeApp (wrong name: app/SomeApp)

Então como executar?

Para executar a classe em app é obrigatório:
1º) incluir o classpath até o diretório raiz do pacote (testes)
2º) incluir o nome da classe: Atenção o nome da classe não é SomeApp. Deve incluir o package assim: app.SomeApp

retorna ao diretório anterior (raiz do pacote) e inclui o nome da classe

caminho absoluto até a raiz do pacote e nome da classe


Incluir o caminho absoluto até app não funciona:

ou


* o classpath tem que ser até o diretório raiz do pacote, que neste caso é testes e incluir o nome da classe app.SomeApp


E se SomeApp dependesse de outra classe?






Para javac:
*Agora javac terá que encontrar através do classpath tanto util.BitUtils quanto testes.OtherTestes


Para java

../ : localiza a raiz de util.BitUtils que é testes
../../ : localiza a raiz de testes.OtherTestes que é java


../ : localiza a raiz de testes.OtherTestes que é java
. : localiza a raiz de util.BitUtils que é testes (já estamos em testes então . informa que é o diretório atual)


Bom foi assim que eu entendi.

Pode haver algum erro de conceito mas pra mim ficou claro dessa forma.

Abraços.

This message was edited 3 times. Last update was at 26/02/2010 13:09:33


Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team