Se non c'è una variabile d'ambiente CLASSPATH impostata e se non è stata passata alcuna specifica per il CLASSPATH alla JVM allora l'applicazione cercherà le classi che le servono a partire dalla cartella corrente (ovvero, dalla cartella da cui viene avviata).
Ciò significa che se tu esegui l'applicazione dalla stessa directory in cui c'è il file class di avvio e tutte i package che essa usa sono direttamente accessibili da tale directory, non hai bisogno di nulla.
Faccio un esempio per chiarirmi: supponiamo che la mia classe principale si chiami "Start" e si trovi dentro alla directory "applicazione". Per semplicità tale directory NON costituisce parte di un package (se lo fosse dovremo agire in modo leggermente diverso, ma casomai lo vediamo poi). Di conseguenza, la classe Start non ha alcuna direttiva "package". Questa è la nostra classe Start:
codice:
import pkg.*;
public class Start {
public static void main(String[] args) {
Pippo p = new Pippo();
System.out.println( p.toString() );
}
}
La classe Start fa uso della classe Pippo, la quale, al contrario, fa parte di un package chiamato "pkg". Questa è la banalissima classe Pippo:
codice:
package pkg;
public class Pippo() {
@Override public String toString() { return "Sono Pippo"; }
}
La classe Pippo fa parte del package "pkg", quindi deve essere all'interno di una directory chiamata "pkg". Se questa directory fosse all'interno della directory "applicazione" non hai alcun problema:
codice:
... // quello che vuoi
+--- applicazione
+--- +--- pkg
+--- +--- +--- Pippo.java
+--- +--- Start.java
Dal prompt dei comandi, mi sposto dentro la directory "applicazione" e da lì compilo ed eseguo:
codice:
C:\Programmi\applicazione> javac Start.java
C:\Programmi\applicazione> java Start
Nota che non ho dovuto compilare esplicitamente la classe Pippo: il compilatore si arrangia a trovarsela, esattamente come si arrangia a trovarsela l'esecutore java.
E questo vale per qualunque package tu stia usando: se questi package sono direttamente raggiungibili dalla directory corrente (nel mio caso, dalla directory "applicazione") non hai bisogno di alcun CLASSPATH: questo perchè il classpath implicito è proprio la directory corrente... da lì parte la ricerca delle classi lungo i percorsi dettati dai package. La radice dei package, ovviamente, è la directory corrente. Quindi, se ho un package chiamato "pkg.components.listeners" allora devo avere nella directory corrente una sottodirectory chiamata "pkg", con all'interno una directory "components" con all'interno una directory "listeners".
Se la directory "applicazione" fosse a sua volta un package (quindi, la classe Start facesse parte del package "applicazione") le cose cambierebbero e avresti diverse "configurazioni" in base alla situazione:
1) Se il package "pkg" fosse un sottopackage di "applicazione" (applicazione.pkg), la struttura della directory rimarrebbe assolutamente la stessa
2) Se il package "pkg" non avesse alcuna relazione con il package "applicazione", allora la directory "pkg" (e tutto il suo contenuto) dovrebbe essere portata fuori dalla directory "applicazione", quindi allo stesso livello.
In ogni caso, per compilare ed eseguire dovresti posizionarti fuori dalla directory "applicazione" e specificare completamente il nome delle classi:
codice:
C:\Programmi> javac applicazione\Start.java
C:\Programmi> java applicazione.Start
Nota che javac vuole la notazione del percorso con il separatore di directory, mentre l'esecutore vuole il punto (come nei package). Anche in questo caso non ho alcuna necessità di compilare esplicitamente la classe Pippo poichè se la trova lui in automatico.
Se tu hai la necessità di specificare un classpath (perchè alcune classi sono contenute all'interno di librerie non direttamente raggiungibili o all'interno di files JAR), allora hai a disposizione l'opzione "-cp" da riga di comando:
codice:
java -cp <elenco classi, files jar> NomeClasseDiAvvio
L'elenco delle classi o files jar è un elenco separato dal separatore di directory (esattamente come se stessi specificando una variabile d'ambiente).
Spero di averti dato un'infarinatura abbastanza completa.
Ciao.