Newsgroup: it.comp.java
Titolo: CLASSPATH

Ciao a tutti,sono all'inizio con java e avrei bisogno di un aiuto: non
riesco a fare caricare le librerie (package) che ho creato creato in un
altro file!!!Non so se mi sono spiegato bene,ma per esempio creo
(rifacendomi al libro Thinking in java 2nd edizione pg 149) una libreria
dichiarando all'inizio del file di testo :
package c05.dessert;
poi creo un altro file che chiamo
Dinner.java
in cui nella prima riga importo la libreria appena creata scrivendo : .
import c05.dessert.*;
 in questo modo dovrei poterla utilizzar all'interno del file Dinner.java .
Il problema è che quando vado ad eseguire scrivendo :
javac Dinner.java
mi crea un errore (anche più di uno ma la causa principale è il primo
errore) dicendomi :
" package c05.dessert does not exists"
indicandomi la riga
import c05.dessert.*;
Ora,penso di aver capito che il problema sta nel settare bene il
classpath,ma come prima cosa andando in (io ho windows XP) : Pannello di
controllo -> Sistema -> Avanzate -> Variabili d'ambiente -> è già presenta
la variabile PATH (che ho gia settato a dovere),ma la classpath non
c'è,quindi dovrò crearla vero???
Poi dove la devo creare in "variabili dell'utente" o in "Variabili di
sistema" ????
Ma cosa più importante che percorso devo scrivere nel classpath???Perche nel
path ho scritto il percorso in cui ho il file .exe di javac e java,qui che
percorso devo scrivere????
Grazie mille dell'aiuto,spero di essere stato abbastanza chiara,ma sono
ancora ai primi passi!!!!

 ancora ai primi passi!!!!
Mhhh non e' ben chiaro quello che intendi per libreria/package...
Un package e' una suddivisione delle compilation units (cioe' dei file .java per 
intenderci) e di fatto sul tuo file system e' rappresentato come una directory.
Questo significa che se crei il file Dessert.java e lo vuoi rendere membro del 
package c05.dessert devi come mi pare hai fatto, dirlo all'inizio del file.
package c05.dessert;
public class Dessert {}
Inoltre, e' buona norma come ti dicevo prima mettere i file all'interno delle 
directory che identificano il tuo package. Questo significa che il file 
Dessert.java in questione andra' nella directory /c05/dessert.
Se non lo fai, credo che avrai dei problemi a far trovare le tue classi al 
compilatore. Per fargliele trovare, devi giustamente settare il classpath, ma 
non ti preoccupare, non c'e' nessuna variabile d'ambiente da toccare.
Puoi semplicemente passarlo come parametro al comando java, in questo modo, 
ipotizzando che il file Dinner.java importi il package in questione:
java -classpath /c05;/c05/dessert Dinner.java
come vedi, passi l'opzione -classpath direttamente all'eseguibile, e se hai piu' 
percorsi da passargli, basta che li separi con un punto e virgola.
Con questo non voglio dire che settare una variabile d'ambiente CLASSPATH non 
funzioni, pero' dovresti andarla ad editare ogni volta che compili/lanci file 
che utilizzano package diversi.
Spero di averti aiutato un po'.
Ciao
Co

 ha scritto nel messaggio
news:wBtFe.38586$b93....@tornado.fastwebnet.it...


 ha scritto nel messaggio
news:wBtFe.38586$b93....@tornado.fastwebnet.it...


 Grazie mille dell'aiuto
Allora, saro' un po' scemo io ma non capisco la tua situazione in generale.
Vediamo. tu hai un package c05.dessert dentro cui c'e' un classe Dinner 
regolarmente iscritta a questo package tramite la dicitura package co5.dessert;
giusto?
Poi hai un altra classe Cookie, anch'essa iscritta allo stesso package.
Ora da Dinner devi chiamare Cookie e giustamente fai import c05.dessert.*;
(a dire il vero non e' necessario, essendo le due classi nello stesso package).
Primo passo: compilare
Vai in C:\Documents and Settings\code\c05\dessert e lanci javac *.java
Ti compila tutti i file
Secondo passo: eseguire
Vai in C:\Documents and Settings\code\ e lancia java -classpath ./ 
c05.dessert.Dinner
(il ./ significa directory corrente, cioe' java andra' a cercare le classi ed i 
relativi package a partire dalla dir corrente (che contiene esattamente 
c05.dessert.Dinner)).
La logica e' questa, dimmi se va ora!
Ciao
Co

 ha scritto nel messaggio
news:12KFe.39642$b93....@tornado.fastwebnet.it...


d'accordo, allora, cerchiamo di chiudere la questione!
c'e' un concetto che devi aver chiaro, cioe' che le classi (e sarebbe meglio i 
relativi sorgenti) devono stare al posto giusto. si, ma quel'e' il posto giusto?
Iniziamo. ipotizziamo che ti trovi nella dir C:\project\ e questa e' la root del 
tuo progetto, cioe' la dir che conterra' tutto cio' che compone il tuo programma.
Ora tu hai creato la classe Cookie:
package c05.dessert;
public class Cookie {
   public Cookie() {
    System.out.println("Cookie constructor");
   }
   void bite() { System.out.println("bite"); }
}
L'hai iscritto al package c05.dessert, questo significa che lo andrai a mettere 
nella sua directory. Creerai quindi la dir C:\project\c05\dessert\ e qui dentro 
ci metterai il tuo file Cookie.java
L'altro file che tu hai chiamato Dinner.java e' fatto cosi':
import c05.dessert.*;
import java.util.*;
public class Dinner {
   public Dinner() {
    System.out.println("Dinner constructor");
   }
   public static void main(String[] args) {
     Cookie x = new Cookie();
   }
}
Non ha definizione di package. Quando questo succede, si dice che la classe 
appartiene al package di default, che non ha nome. Dove devi mettere questa 
classe? all'inizio della tua gerarchia di package, che in questo caso e' 
C:\project\. Ricorda quindi, niente dichiarazione di package = package di 
default = nessuna dir in cui risiedere = root del tuo progetto.
La tua situazione deve essere:
C:\project\
       |
       -> c05\
       |   |
       |   -> dessert\
       |         |
       |         -> Cookie.java
       |
       -> Dinner.java
Ora, compiliamo.
Posizionati in C:\project\ e lancia
'javac *.java'
Questo compila sia Dinner che Cookie, essendo quest'ultimo referenziato da 
Dinner. Ora eseguiamo Dinner.
Lancia
'java -classpath ./ Dinner'
Funziona!
Ora, per amor di completezza ti faccio un esempio ulteriore (ma tu mi fai una 
statuetta!). Ipotizziamo che tu volessi lanciare Cookie (in cui hai inserito un 
opportuno metodo main()). La sintassi corretta sarebbe stata
'java -classpath ./ c05.dessert.Cookie'
Vedi?
Le classi le devi chiamare col loro nome completo, quindi con tutta la gerarchia 
di package alle spalle, se le vuoi chiamare dalla root del tuo progetto. Il 
classpath e' "directory corrente" ed infatti, il package c05.dessert e' 
contenuto nella dir corrente (C:\project\).
Beh spero che questo ti abbia tolto ogni dubbio!
Ciao
Co

 ha scritto nel messaggio
news:xvOFe.40289$b93....@tornado.fastwebnet.it...
