Не понимаю следующее использование -classpath javac - PullRequest
0 голосов
/ 16 января 2012

Мне не очень понятен следующий вопрос из Книги SCJP (хотя я прочитал решение и объяснение, хотя) ..

Рассмотрим следующую структуру каталогов: -

foo --> test --> xcom --> A.class, B.java

Здесь foo, test и xcom являются каталогами. A.class и B.java - это файлы в каталоге xcom.

Ниже приведены исходные коды соответствующих файлов: -

A.java

package xcom;
public class A { }

B.java

package xcom;
public class B extends A { }

Путь к классу по умолчанию - /foo.

.

Теперь, чтобы скомпилировать B.java, я сохраняю свой текущий каталог в качестве теста и даю: -

javac -classpath xcom xcom/B.java

Здесь я даю classpath как xcom, который имеет A.class. Но все равно он не находит класс А. Почему это так ??

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Если ваши классы находятся в пакете xcom, тогда ваш classpath должен находиться в каталоге, расположенном прямо над ним. В этом случае classpath должен быть foo / test.

И если ваш текущий каталог - foo / test , то это должен быть ваш javac:

javac -classpath . xcom/B.java
0 голосов
/ 16 января 2012

Я думаю, что основной причиной здесь является неправильное понимание «полностью определенного имени» в Java.

Полными именами ваших двух классов являются xcom.A и xcom.B.Их источник находится в файлах A.java и B.java в каталоге с именем xcom;Полные имена определяют структуру каталогов.Когда вы собираетесь использовать файлы либо для их компиляции, либо для запуска, classpath содержит одно или несколько мест, из которых можно найти полные имена;поэтому java ищет xcom \ A.java и xcom \ B.java (при компиляции) и xcom \ A.class и xcom \ B.class (при запуске).

Именно поэтому classpath долженукажите каталог, содержащий xcom.

По мере продвижения в более сложные среды: путь к классам может быть списком таких расположений;каждое местоположение разделяется точкой с запятой в окнах и двоеточием в системах Unix.Как вы уже видели, каждое местоположение может быть каталогом, но это также может быть файл JAR.JAR-файлы имеют формат zip-файлов, а zip-файлы имеют структуру каталогов, как и у дисков.Таким образом, вы можете сжать файлы классов, сохранив их родительский элемент xcom (но не полные пути), и указать файл jar в пути к классам вместо каталога.

Я знаю, что на вопрос уже был получен ответ, но подумал, что вам также может понравиться фоновое объяснение.

0 голосов
/ 16 января 2012

Поскольку вы должны указать корень пути к классу в аргументе -classpath, например javac -classpath . xcom/B.java. Для компиляции класса B Java-компилятору требуется класс A, он пытается найти файл класса A в {classpathroot}/xcom/.

Примечание: . - это текущий каталог

...