file a.java
-----------
package a;
<codice>
file b.java
-----------
package test;
<codice>
file c.java
------------
package test;
intestazione della classe statica e del metodo statico main{
b.test();
}
Ottengo all'esecuzione errore "Exception in thread "main"
java.lang.NoClassDefFoundError: c (wrong name: test/c) "
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at ecc. ecc.
Modifico allora il file c:
file c.java
------------
import ProvaStudente.*;
intestazione della classe statica e del metodo statico main{
b.test();
}
E funziona. Come mai? E' per caso un problema di classpath?
In questo modo il .class di partenza del programma si ritrova gli altri
.class in sottodirectory di quella in cui sta lui. Il classpath di
sistema contiene la directory due livelli sopra a quella in cui risiede
il .class di partenza oltre ovviamente a "./"
ciao e grazie anticipatamente per le risposte
--
Google Image Labeler cumulative score: 76770
Impostare il CLASSPATH non serve, ci pensa Eclipse.
--
Andrea Francia
http://www.andreafrancia.it/
Potresti provare a spiegarti piu' chiaramente?
Le informazioni che devi dare sono queste:
1. Qual'é la configurazione che provoca il comportamento che non capisci
2. Il comportamento effettivo
3. Il comportamento atteso.
Lascia perdere la storia delle prove che hai fatto, e le ipotesi sulla
causa problema, incasinano la comprensione e non aiutano.
Riguardo alla voce 1:
Incolla il codice che effettivamente da il problema non una versione
modificata (magari semplificata).
Se la versione originale è troppo complicata, semplificala e vedi se
il problema c'e' ancora. Di solito in questo modo si riesce a scoprire
la soluzione prima ancora di scrivere il post.
Riguardo a 2:
Hai fatto bene a riportare il messaggio di errore facendo il copia
incolla, vorrei che tutti quelli che chiedono aiuto facessero come te.
Non credo di avere fatto errori compile time dato che Eclipse non li
segnala...
> 2. Il comportamento effettivo
>
Se tengo la classe di partenza del programma, la classe C, quella col
main(), nel package-directory "test" ottengo in fase di esecuzione
l'errore che dicevo.
> 3. Il comportamento atteso.
>
Vedere stampate a schermo due tre linee di testo come indicato nei
sorgenti. Ciò avviene se la classe con il main() viene posizionata in
c:\progetti\nome_progetto\bin\ quindi se la classe appartiene al package
di default e di conseguenza vede gli altri package del mio progetto in
sue sottodirectory.
> Riguardo alla voce 1:
> Incolla il codice che effettivamente da il problema non una versione
> modificata (magari semplificata).
> Se la versione originale è troppo complicata, semplificala e vedi se
> il problema c'e' ancora. Di solito in questo modo si riesce a scoprire
> la soluzione prima ancora di scrivere il post.
>
E' sufficiente quello che ho scritto o devo copiare e incollare i
sorgenti? E' un problema veramente banale, se posso evitare evito di
copia e incollarli (se serve dopo lo faccio).
grazie per il supporto
Aggiungo perņ che non č necessario impostare la variabile di ambiente,
ma puoi usare l'opzione -cp.
Per esempio:
java -cp . package.Classe
>
>> 2. Il comportamento effettivo
>>
Scrivi:
- in che directory sei (incollando l'output di cd)
- il comando che avvii, es:
java -cp . NomeClasse
Non dire che avvii C o A, metti il nome vero!
> dir directory-del-progetto\bin
>
c:\Projects\ArchivioStudenti\bin
> dir directory-del-progetto\src
>
c:\Projects\ArchivioStudenti\src
>>> 2. Il comportamento effettivo
>>>
> Scrivi:
> - in che directory sei (incollando l'output di cd)
> - il comando che avvii, es:
> java -cp . NomeClasse
>
Sono in c:\Projects\ArchivioStudenti\bin
lancio il comando "java NomeClasse" da console e funziona.
Se dichiaro la classe che contiene il main() come appartenente al
package "test" e quindi il .class viene messo da Eclipse dopo la
compilazione in c:\Projects\ArchivioStudenti\bin\test e lancio dalla
directory "test"
java NomeClasse
ottengo errore in fase di runtime ("Exception in thread "main"
java.lang.NoClassDefFoundError: NomeClasse (wrong name: test/NomeClasse)).
Il CLASSPATH di sistema č:
.;
C:\Programmi\Java\jdk1.6.0_06\lib;
c:\Projects\;
C:\Programmi\Java\jre1.5.0_10\lib\ext\QTJava.zip
Leggo dall'Heckel (Thinking in Java 3rd edition):
"It's worth remembering that anytime you create a package, you
implicitly specify a directory structure when you give the package a
name. The package must live in the directory indicated by its name,
which must be a directory that is searchable starting from the CLASSPATH."
c:\Projects\ nella mia variabile CLASSPATH č sufficiente o dovrei forse
mettere c:\Projects\ArchivioStudenti\bin ?
"Experimenting with the package keyword can be a bit frustrating at
first, beacause unless you adhere to the package-name to directory-path
rule, you'll get a lot of mysterious runtime messages about not being
able to find a particular class, even if that class is sitting there in
the same directory."
Io ho proprio degli errori di questo tipo se provo a mettere pure la
classe col main() nel package test e quindi nella directory:
c:\Projects\ArchivioStudenti\bin\test
"If you get a message like this, try commenting out the package
statement, and if it runs, you'll know where the problem lies"
Infatti se tolgo lo statement "package test" dalla classe con il main()
il programma funziona.
La mia domanda č: č possibile mettere anche la classe con il main() nel
package "test" cosicchč io eviti di usare il package di default e tenga
tutte le classi del mio progettino in un qualche package?
Per farlo devo per caso aggiungere qualcosa alla variabile CLASSPATH?
Perchč comincio a capire che forse il problema č proprio lě...
Certo, posso tenere senza problema alcuno nel package di default la
classe col main() ma vorrei CAPIRE se e come č possibile metterla nel
package "test".
grazie del supporto
Metti il nome vero della classe, te l'ho anche già spiegato.
> Se dichiaro la classe che contiene il main() come appartenente al
> package "test" e quindi il .class viene messo da Eclipse dopo la
> compilazione in c:\Projects\ArchivioStudenti\bin\test e lancio dalla
> directory "test"
Continuui a non essere chiaro.
>
> java NomeClasse
>
> ottengo errore in fase di runtime ("Exception in thread "main"
> java.lang.NoClassDefFoundError: NomeClasse (wrong name: test/NomeClasse)).
>
> Il CLASSPATH di sistema è:
> .;
> C:\Programmi\Java\jdk1.6.0_06\lib;
> c:\Projects\;
> C:\Programmi\Java\jre1.5.0_10\lib\ext\QTJava.zip
>
> Leggo dall'Heckel (Thinking in Java 3rd edition):
Che c'entra il libro? Devi solo spiegare
1. la configurazione
2. i passi fatti
3. il risultato effettivo
4. il risultato atteso
L'esposizione delle ipotesi che puoi avere sul problema compomettono la
chiarezza dell'esposizione del problema.
> La mia domanda è: è possibile mettere anche la classe con il main() nel
> package "test" cosicchè io eviti di usare il package di default e tenga
> tutte le classi del mio progettino in un qualche package?
Il package di default dovresti evitarlo a prescindere.
Non ha senso usare il package di test per una classe che non faccia
parte dei test. Piuttosto crea un package apposito per contenere le
classi dell'applicazione.
> Per farlo devo per caso aggiungere qualcosa alla variabile CLASSPATH?
No
Questo perché internamente java usa come nome di una classe il nome
con prima tutto il package, cosa di cui ti renderai conto quando
incomincerai a usare jdbc (se mai lo farai).
On 16 Lug, 15:48, mrzac <mrz...@inwind.itALIA> wrote:
> Andrea Francia wrote:
> > Scrivi la directory del progetto.
> > Scrivi l'output di
> > dir directory-del-progetto
>
> c:\Projects\ArchivioStudenti\
>
> > dir directory-del-progetto\bin
>
> c:\Projects\ArchivioStudenti\bin
>
> > dir directory-del-progetto\src
>
> c:\Projects\ArchivioStudenti\src
>
> >>> 2. Il comportamento effettivo
>
> > Scrivi:
> > - in che directory sei (incollando l'output di cd)
> > - il comando che avvii, es:
> > java -cp . NomeClasse
>
> Sono in c:\Projects\ArchivioStudenti\bin
> lancio il comando "java NomeClasse" da console e funziona.
> Se dichiaro la classe che contiene il main() come appartenente al
> package "test" e quindi il .class viene messo da Eclipse dopo la
> compilazione in c:\Projects\ArchivioStudenti\bin\test e lancio dalla
> directory "test"
>
> java NomeClasse
>
> ottengo errore in fase di runtime ("Exception in thread "main"
> java.lang.NoClassDefFoundError: NomeClasse (wrong name: test/NomeClasse)).
>
> Il CLASSPATH di sistema è:
> .;
> C:\Programmi\Java\jdk1.6.0_06\lib;
> c:\Projects\;
> C:\Programmi\Java\jre1.5.0_10\lib\ext\QTJava.zip
>
> Leggo dall'Heckel (Thinking in Java 3rd edition):
>
> "It's worth remembering that anytime you create a package, you
> implicitly specify a directory structure when you give the package a
> name. The package must live in the directory indicated by its name,
> which must be a directory that is searchable starting from the CLASSPATH."
>
> c:\Projects\ nella mia variabile CLASSPATH è sufficiente o dovrei forse
> mettere c:\Projects\ArchivioStudenti\bin ?
>
> "Experimenting with the package keyword can be a bit frustrating at
> first, beacause unless you adhere to the package-name to directory-path
> rule, you'll get a lot of mysterious runtime messages about not being
> able to find a particular class, even if that class is sitting there in
> the same directory."
>
> Io ho proprio degli errori di questo tipo se provo a mettere pure la
> classe col main() nel package test e quindi nella directory:
> c:\Projects\ArchivioStudenti\bin\test
>
> "If you get a message like this, try commenting out the package
> statement, and if it runs, you'll know where the problem lies"
>
> Infatti se tolgo lo statement "package test" dalla classe con il main()
> il programma funziona.
>
> La mia domanda è: è possibile mettere anche la classe con il main() nel
> package "test" cosicchè io eviti di usare il package di default e tenga
> tutte le classi del mio progettino in un qualche package?
> Per farlo devo per caso aggiungere qualcosa alla variabile CLASSPATH?
> Perchè comincio a capire che forse il problema è proprio lì...
> Certo, posso tenere senza problema alcuno nel package di default la
> classe col main() ma vorrei CAPIRE se e come è possibile metterla nel