Perché il comando javac -cp. pkg/A.java lavoro con successo, anche se non abbiamo ancora compilato B.java
Quando si compila A.java
, il compilatore compilare B.java
pure poiché sia A.java
e B.java
sono nello stesso pacchetto. Funzionerà anche se B.java
era in un altro pacchetto da A.java
(fornito B
è pubblico) purché entrambi i pacchetti siano presenti nella directory wrk
e si compili A.java
dalla directory wrk
.
Dal Oracle documentation per javac
:
Se l'opzione -sourcepath non è specificata, il percorso di classe utente viene cercato anche per i file di origine.
Dal Oracle document per CLASSPATH
Il valore predefinito del percorso di classe è ""
Se non è stata impostata una CLASSPATH
, verrà in default a .
. Successivamente, lo sourcepath
sarà anche .
poiché il valore predefinito sourcepath
è lo stesso di CLASSPATH
. È possibile confermare che l'identificativo predefinito è impostato su .
compilando A.java
utilizzando javac -verbose -g pkg\A.java
.Si noti che il compilatore è alla ricerca nella directory corrente per .java
file:
[parsing started pkg\A.java] [parsing completed 29ms] [search path for source files: [.]]
Per verificare che l'sourcepath
è impostato su CLASSPATH
, si può provare a cambiare il CLASSPATH
utilizzando l'opzione -cp
compilando A.java
utilizzando javac -cp C:\ -verbose -g pkg\A.java
. A.java
non verrà compilato questa volta poiché è stato sovrascritto lo CLASSPATH
su C:\
ed è per questo che verrà impostato anche sourcepath
. Questa è l'uscita:
[parsing started pkg\A.java] [parsing completed 26ms] [search path for source files: [C:\]] pkg\A.java:3: cannot find symbol symbol : class B
Anche se la directory corrente è/top/wrk/pkg allora il comando javac A.java funziona. Come mai?
Questo non funziona indipendentemente dal fatto che è presente in B.class
pkg
Diniego: Non posso che confermare questo comportamento su Windows, ma dubito fortemente che dovrebbe essere diverso su altri sistemi operativi.
La risposta sta nel http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html#BHCCHDGH. Non c'è tempo per riprodurlo qui sotto forma di risposta, in breve, approssimativamente: Cerca anche i file sorgente nel classpath. – Marco13
Non riesco a riprodurre questo. Non riesce a compilare sulla mia macchina. Sei sicuro che B non sia mai stato compilato? –
È una cosa per Mac/Windows. Vedi la mia risposta modificata e ora (si spera) definitiva per maggiori dettagli. –