Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Problema con scelta della disposizione nel filesystem dei file di un progetto

0 views
Skip to first unread message

mrzac

unread,
Jul 16, 2008, 7:10:28 AM7/16/08
to
Ho tre file sorgenti in sottodirectory della directory "src" di un
progetto Java (per la
cronaca, realizzato con Eclipse): il mio CLASSPATH contiene il path
assoluto della dir "\Progetti" mentre la directory "src" sta in
"\Progetti\nome_progetto\src". File "a.java" nella dir "/src/a", file
"b.java" e "c.java" inizialmente nella dir "/src/test" poi ho fatto un
cambiamento perchè ho incontrato un problema in fase di esecuzione.
C.java contiene il metodo main() starting point del programma.
Riassunto dei sorgenti:

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

mrzac

unread,
Jul 16, 2008, 7:26:17 AM7/16/08
to
mrzac wrote:
> 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 "./"
>
Cosa dovrei fare per far funzionare il programma mettendo le due classi
B e C nel package "test"? Ricordo che C è la classe da cui parte il
programma.
Se tengo C fuori dal package "test", lasciandolo nel package di default
(nel filesystem C.class si ritrova in tal modo gli altri due package in
sottodirectory della sua), tutto funziona...

Andrea Francia

unread,
Jul 16, 2008, 7:37:48 AM7/16/08
to
mrzac wrote:
> Ho tre file sorgenti in sottodirectory della directory "src" di un
> progetto Java (per la
> cronaca, realizzato con Eclipse): il mio CLASSPATH contiene il path
> assoluto della dir "\Progetti" mentre la directory "src" sta in
> "\Progetti\nome_progetto\src".

Impostare il CLASSPATH non serve, ci pensa Eclipse.

--
Andrea Francia
http://www.andreafrancia.it/

Andrea Francia

unread,
Jul 16, 2008, 7:49:12 AM7/16/08
to
mrzac wrote:
> Ho tre file sorgenti in sottodirectory della directory "src" di un
...

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.

mrzac

unread,
Jul 16, 2008, 7:59:49 AM7/16/08
to
Andrea Francia wrote:
> Impostare il CLASSPATH non serve, ci pensa Eclipse.
>
Ma io eseguo il programma da linea di comando (dalla consolle insomma,
nella fattispecie dal prompt di MS-DOS di Windows XP), non credo che
Eclipse intervenga, dico bene?

mrzac

unread,
Jul 16, 2008, 8:29:27 AM7/16/08
to
Andrea Francia wrote:
> mrzac wrote:
>> Ho tre file sorgenti in sottodirectory della directory "src" di un
>> ...
>>
> Potresti provare a spiegarti piu' chiaramente?
> Le informazioni che devi dare sono queste:
> 1. Qual'é la configurazione che provoca il comportamento che non capisci
>
Eclipse mette i binari .class nella directory
nome_progetto/bin/nome_package mentre i sorgenti in
nome_progetto/src/nome_package. Se si usa il package di default (nessuna
indicazione di appartenenza ad un package) ogni sorgente appartenente al
package di default sta in nome_progetto/src e il binario sta in
nome_progetto/bin.
Il sistema ha come CLASSPATH (non indico il classpath al momento del
lancio del comando "java" da linea di comando ma sfrutto la variabile di
sistema) la directory parent della directory "nome_progetto". Ovvero il
CLASSPATH indica "c:\progetti" mentre io lancio l'applicazione da
c:\progetti\nome_progetto\bin\test e ottengo errore.
La configurazione con la classe (che chiamerò per semplicità in questo
messaggio "A") che descrive i dati e i metodi che modello nel programma
sta in una directory-package mentre in un'altra directory-package
chiamata "test" sta la classe "B" che usa la classe A; allo stesso tempo
nella stessa directory-package di B metto una classe C che dichiara il
metodo main() da cui faccio partire il programma (nel main mi limito a
chiamare il metodo B.test() ).

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

mrzac

unread,
Jul 16, 2008, 8:32:25 AM7/16/08
to
mrzac wrote:
>> 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.
>
Dico "quindi" perchč Eclipse, come ho spiegato, si comporta cosě.

Andrea Francia

unread,
Jul 16, 2008, 9:11:27 AM7/16/08
to
mrzac wrote:
> Andrea Francia wrote:
>> Impostare il CLASSPATH non serve, ci pensa Eclipse.
>>
> Ma io eseguo il programma da linea di comando (dalla consolle insomma,
> nella fattispecie dal prompt di MS-DOS di Windows XP), non credo che
> Eclipse intervenga, dico bene?
>
Dici bene, ritiro quello che ho detto.

Aggiungo perņ che non č necessario impostare la variabile di ambiente,
ma puoi usare l'opzione -cp.

Per esempio:
java -cp . package.Classe

Andrea Francia

unread,
Jul 16, 2008, 9:19:28 AM7/16/08
to
mrzac wrote:
> Andrea Francia wrote:
>> mrzac wrote:
>>> Ho tre file sorgenti in sottodirectory della directory "src" di un ...
>>>
>> Potresti provare a spiegarti piu' chiaramente?
>> Le informazioni che devi dare sono queste:
>> 1. Qual'é la configurazione che provoca il comportamento che non capisci
>>
Scrivi la directory del progetto.
Scrivi l'output di
dir directory-del-progetto
dir directory-del-progetto\bin
dir directory-del-progetto\src

>
>> 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!

mrzac

unread,
Jul 16, 2008, 9:48:59 AM7/16/08
to
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
package "test".

grazie del supporto

Andrea Francia

unread,
Jul 16, 2008, 10:26:46 AM7/16/08
to
mrzac 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.

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

mrzac

unread,
Jul 16, 2008, 11:37:41 AM7/16/08
to
Andrea Francia wrote:
> Metti il nome vero della classe, te l'ho anche già spiegato.
>
Ti mando una mail dettagliata, scusa se ci ho messo tanto.

Alessandro Carraro (JUG Padova)

unread,
Jul 16, 2008, 12:25:15 PM7/16/08
to
Se non ho capito male. sembra che tu vada nella directory test (nome
del package) e da li invochi la classe NomeClasse. Invece dovresti
stare sempre nella directory bin (la root dei compilati) e invocare il
VERO nome della classe (in gergo "qualified name"), ovvero con il
comando
java test.NomeClasse

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

mrzac

unread,
Jul 16, 2008, 12:29:16 PM7/16/08
to
Grazie a tutti del supporto! Dal prossimo progettino di prova farň
tesoro dei vostri consigli.
Ora comincio ad avere piů chiari questi concetti...
0 new messages