Dlaczego polecenie javac -cp. pkg/A.java praca powodzeniem choć jeszcze nie opracowano B.java
Podczas kompilowania A.java
, kompilator skompiluje B.java
jak dobrze ponieważ zarówno A.java
i B.java
są w tym samym opakowaniu. To zadziała nawet, jeśli B.java
był w innym pakiecie niż A.java
(pod warunkiem, że oba pakiety są obecne w katalogu wrk
, a kompilujesz A.java
z katalogu.
Z Oracle documentation dla javac
:
Jeśli opcja -sourcepath nie jest określony, ścieżka klasy użytkownika jest również szukał plików źródłowych.
Z Oracle document dla CLASSPATH
wartość domyślna ścieżce klasy jest ""
Jeśli nie ustawiono wartości CLASSPATH
, zostanie ona domyślnie ustawiona na .
. Następnie, sourcepath
będzie również .
, ponieważ domyślnie sourcepath
jest taki sam jak CLASSPATH
. Możesz potwierdzić, że domyślna ścieżka źródłowa jest ustawiona na .
, kompilując A.java
, używając javac -verbose -g pkg\A.java
.Należy zauważyć, że kompilator szuka w bieżącym katalogu dla .java
plików:
[parsing started pkg\A.java] [parsing completed 29ms] [search path for source files: [.]]
Aby potwierdzić, że sourcepath
jest ustawiony na CLASSPATH
, można spróbować zmienić CLASSPATH
używając opcji -cp
kompilując A.java
użyciu javac -cp C:\ -verbose -g pkg\A.java
. A.java
nie skompiluje się tym razem, ponieważ nadpisałeś CLASSPATH
do C:\
i domyślnie jest to również sourcepath
. Jest to wyjście:
[parsing started pkg\A.java] [parsing completed 26ms] [search path for source files: [C:\]] pkg\A.java:3: cannot find symbol symbol : class B
Także jeśli bieżący katalog to/top/wrk/pkg następnie javac polecenia A.java działa. Jak to?
To nie będzie działać niezależnie od tego, czy B.class
jest obecny w pkg
Uwaga: Mogę tylko potwierdzić to zachowanie w systemie Windows, ale wątpię, że powinno być inaczej w innych systemach operacyjnych.
Odpowiedź leży w http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html#BHCCHDGH. Nie ma czasu na odtworzenie tego tutaj w formie odpowiedzi, krótko mówiąc, z grubsza: szuka również plików źródłowych w ścieżce klas. – Marco13
Nie mogę tego odtworzyć. Nie można go skompilować na moim komputerze. Czy jesteś pewien, że B nigdy nie został skompilowany? –
To sprawa Mac/Windows. Zobacz moją zredagowaną i teraz (mam nadzieję) ostateczną odpowiedź, aby uzyskać więcej szczegółów. –