Ответ 1
Почему команда javac -cp. pkg/A.java успешно работает, хотя мы еще не скомпилировали B.java
Когда вы компилируете A.java
, компилятор будет компилировать B.java
, так как оба A.java
и B.java
находятся в одном пакете. Это будет работать даже если B.java
находился в другом пакете от A.java
(при условии, что B
является общедоступным), если оба пакета присутствуют в каталоге wrk
и вы скомпилируете A.java
из каталога wrk
.
Из документации Oracle для javac
:
Если параметр -sourcepath не указан, путь к пользовательскому классу также выполняется для исходных файлов.
Из документа Oracle для CLASSPATH
Значение по умолчанию для пути к классу - "."
Если вы не установили CLASSPATH
, по умолчанию будет .
. Впоследствии sourcepath
также будет .
, так как по умолчанию sourcepath
совпадает с CLASSPATH
. Вы можете подтвердить, что исходный путь по умолчанию установлен на .
, компилируя A.java
с помощью javac -verbose -g pkg\A.java
. Обратите внимание, что компилятор ищет в текущем каталоге файлы .java
:
[parsing started pkg\A.java]
[parsing completed 29ms]
[search path for source files: [.]]
Чтобы подтвердить, что для параметра sourcepath
установлено значение CLASSPATH
, вы можете попробовать изменить CLASSPATH
с помощью параметра -cp
, компилируя A.java
с помощью javac -cp C:\ -verbose -g pkg\A.java
. A.java
не будет компилироваться на этот раз, так как вы перезаписали CLASSPATH
до C:\
и что то, что sourcepath
будет по умолчанию. Это результат:
[parsing started pkg\A.java]
[parsing completed 26ms]
[search path for source files: [C:\]]
pkg\A.java:3: cannot find symbol
symbol : class B
Также, если текущий каталог -/top/wrk/pkg, тогда команда javac А. Ява работает. Как это так?
Это не будет работать независимо от того, присутствует ли B.class
в pkg
Отказ от ответственности: Я могу только подтвердить это поведение в Windows, но я очень сомневаюсь, что он должен быть другим в других операционных системах.