Newsgroup: it.comp.java
Titolo: Problema con scelta della disposizione nel filesystem dei file di un progetto

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

 
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...


 "\Progetti\nome_progetto\src". 
Impostare il CLASSPATH non serve, ci pensa Eclipse.
-- 
Andrea Francia
http://www.andreafrancia.it/

 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.


 
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?


 
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


 
Dico "quindi" perchč Eclipse, come ho spiegato, si comporta cosě.


 
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


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


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


 Per farlo devo per caso aggiungere qualcosa alla variabile CLASSPATH? 
No


 
Ti mando una mail dettagliata, scusa se ci ho messo tanto.


 classe col main() ma vorrei CAPIRE se e come è possibile metterla nel


Grazie a tutti del supporto! Dal prossimo progettino di prova farň 
tesoro dei vostri consigli.
Ora comincio ad avere piů chiari questi concetti...
