gianluca.aguzzi@unibo.it
angelo.filaseta@unibo.it
Questo materiale è ampiamente basato su quello realizzato dai Prof. Mirko Viroli e Roberto Casadei, che ringrazio.
Ogni errore riscontratovi è esclusiva responsabilità degli autori di questo documento.
javac
e java
.java
) e file di classi compilate (.class
)Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. Code for readability. John Woods [disputed]}
Ad esempio:
Notare che sono sempre consistenti!
E che sono tipicamente restrizioni delle convenzioni, non modifiche! Nel corso faremo riferimento alle Java Code Conventions (con qualche vincolo in più)
package
usano sempre e solo lettere minuscolecamelCase
, evitare gli underscore (_)PascalCase
static final
(costanti di classe) sono interamente maiuscoli e possono usare underscorejavac
.java
), generando classi in bytecode, che prendono la forma di file .class
nella medesima directorysrc
, per i file sorgenti (.java
)bin
, contenente le classi compilate (.class
)
javac
-d
: consente di specificare la cartella destinazione in cui compilare i file .java
javac -d <CARTELLA DESTINAZIONE> <FILE JAVA>
javac -d <CARTELLA DESTINAZIONE> <ELENCO DI FILE JAVA>
È possibile anche utilizzare la wildcard (*
) invece di elencare tutti i file!
progetti/*/src/*.java
elenca tutti i file con estensione java dentro ciascuna cartella
src
di ciascuna cartella dentro progetti
java
), si eseguono classi, non files
L’insieme ordinato dei percorsi prende il nome di classpath
Se non specificato, il classpath di Java include automaticamente:
rt.jar
ed altri file importantijava.lang.Math
Possono essere aggiunte directory al classpath
-cp
(o, equivalentemente, -classpath
), seguita da un elenco di percorsi
:
(Unix);
(Windows)"
)Il classpath non è composto da una sola cartella, ma può contenere più cartelle, oltre a file compressi contenenti bytecode e risorse, come zip o jar (li vedremo in futuro).
Si possono specificare più cartelle utilizzando come separatore il simbolo “:
” (per sistemi Unix) oppure “;
” (per sistemi Windows)
javac -d bin -cp "lib1:lib2:lib3" src/*.java
src
, mettendo i compilati dentro bin
. In compilazione, potrà linkare tutte le classi che si trovano nelle cartelle lib1
, lib2
e lib3
: nel caso in cui alcuni sorgenti in src stiano usando delle classi definite dentro queste cartelle, la compilazione avrà successo.
javac -d bin -cp "lib1;lib2;lib3" src/*.java
java -cp "bin:lib1:lib2:lib3" MyClass
MyClass
. Cercherà questa classe e tutte quelle collegate all’interno delle cartelle bin
, lib1
, lib2
e lib3
.java -cp "bin;lib1;lib2;lib3" MyClass
È buona norma organizzare i sorgenti in modo da rappresentare su filesystem la struttura dei package. Si noti però che (dato che il compilatore lavora su file) questa scelta non è teoricamente obbligatoria!
Quando ad essere compilata è una classe dichiarata in un package, il compilatore riproduce la struttura dei package usando delle directory
Dato che l’interprete non lavora con file ma con classi, il loro layout sul file system non può essere modificato!
L’esecuzione è identica al caso precedente, si faccia solo attenzione ad usare l’intero nome della classe, che in Java include anche il nome del package!
Supponiamo di avere in mano la seguente classe:
package it.unibo.compilation.math;
public class UseComplex {
public static void main(final String[] args) {
final ComplexNum c1 = new ComplexNum();
c1.build(1, -45);
final ComplexNum c2 = new ComplexNum();
c2.build(2, 8);
System.out.println(c1.toStringRep());
System.out.println(c2.toStringRep());
c1.add(c2);
System.out.println("c1 new value is: " + c1.toStringRep() + "\n");
}
}
Se provassimo a compilarla, otterremmo degli errori
src\oop\lab2\math\UseComplex.java:6: error: cannot find symbol
ComplexNum c1 = new ComplexNum();
^
symbol: class ComplexNum
location: class UseComplex
src\oop\lab2\math\UseComplex.java:6: error: cannot find symbol
ComplexNum c1 = new ComplexNum();
^
symbol: class ComplexNum
location: class UseComplex
src\oop\lab2\math\UseComplex.java:8: error: cannot find symbol
ComplexNum c2 = new ComplexNum();
^
...
ComplexNum
per poterla
linkare e per poter compilare una classe che la riferisceComplexNum
-cp
in fase di compilazioneSupponiamo di avere solo la versione compilata di ComplexNum
(ovvero non il sorgente)
ComplexNum
è stata compilata nel
classpath di javac
!UseComplex.java
nel percorso src/oop/lab02/math/
ComplexNum
compilato dentro lib/
javac -d bin -cp lib src/oop/lab02/math/UseComplex.java
javac -d bin -cp lib src/oop/lab02/math/UseComplex.java
javac
$\Rightarrow$ Invocazione del compilatore-d bin
$\Rightarrow$ -d
determina la destinazione.
Vogliamo compilare dentro la cartella bin
-cp lib
$\Rightarrow$ -cp
consente di aggiungere percorsi al
classpath. Noi vogliamo cercare le classi che ci servono, oltre che nella
posizione corrente e nelle librerie java, anche dentro lib
src/oop/lab02/math/UseComplex.java
$\Rightarrow$ Il file che
vogliamo compilareAvendo come riferimento l’esempio precedente, proviamo ad eseguire.
UseComplex
dobbiamo dire alla JVM, tramite
-cp
, dove trovare:
ComplexNum
(classe, non file)UseComplex
(classe, non file)Si trovano in due percorsi diversi!
Dobbiamo specificare come argomento di -cp
due percorsi, usando il separatore:
:
su sistemi UNIX (Linux, Mac OSX, BSD);
su sistemi WindowsUseremo quindi:
java -cp bin:lib oop.lab02.math.UseComplex
(Unix)java -cp bin;lib oop.lab02.math.UseComplex
(Windows)Visto che all’esame il loro utilizzo è richiesto, è necessario imparare a memoria le opzioni di java
e javac
?
Entrambi i comandi (e praticamente tutti i comandi Unix) hanno con loro un’opzione che consente di stampare a video un help. Provate:
java -help
javac -help
Gli help stampano abbondante testo con le relative istruzioni e a me serve una riga, davvero devo imparare a leggere e capire uno help?