ciamba87 ha scritto:
A questo punto però non capisco la differenza tra inserire "java" o "java cp ." nel prompt.
Per eseguire un file .class devo per forza essere nella directory (nel senso che devo averla come current directory sul prompt) che contiene il package?
No, non necessariamente. Quando avvi la JVM essa ricerca e trova le classi SOLAMENTE basandosi sul "classpath".
Il classpath è semplicemente un elenco di directory e/o file .jar che fanno da "base" per poter trovare le classi.
La directory "corrente" ovviamente c'entra all'interno della applicazione ma solamente se hai usato riferimenti es. a immagini o altro con dei percorsi relativi.
Immagina di avere una classe con nome completamente qualificato
prova.HelloWorld
Il file .class potrebbe essere ad esempio in:
C:\Progetti\Java\prova\HelloWorld.class
I nomi di package devono SEMPRE "riflettersi" nel nome delle cartelle e tra poco capirai perché.
Se stai come directory corrente in C:\Progetti\Java puoi dare:
java -cp . prova.HelloWorld
Se NON hai la variabile di ambiente CLASSPATH (così la directory corrente è per default in classpath) oppure se CLASSPATH contiene il "." (=directory corrente), allora puoi evitare il -cp
java prova.HelloWorld
Ora se ti sposti in C:\ come directory corrente e dai il comando
java -cp C:\Progetti\Java prova.HelloWorld
la classe viene comunque trovata e avviata correttamente.
Dal nome qualificato della classe, la JVM ricava un percorso relativo prova\HelloWorld.class e poi ragiona accodando questo percorso a tutti i percorsi "base" trovati in classpath. Quindi esiste un prova\HelloWorld.class sotto C:\Progetti\Java? Sì, stop.