| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2010 18:56:06
|
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2010 19:16:37
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2010 19:19:15
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2010 19:21:06
|
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/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/01/2010 19:24:58
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2010 21:12:50
|
pmlm
GUJ Master
Membro desde: 20/04/2009 12:20:07
Mensagens: 1199
Localização: Portugal
Offline
|
Não colocando na package app?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2010 09:05:56
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/02/2010 17:49:58
|
rmalati
Virtual Machine Man
![[Avatar]](/images/avatar/3bc8f7011e08bfe6830c967b497bdf6d.jpg)
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)" |
|
|
 |
|
|