#java #import #classpath #package
#java #импорт #путь к классу #пакет
Вопрос:
У меня есть файл, который импортирует org.w3c.dom.Документ. Компиляция и запуск в порядке, но я не понимаю, как он знает, где найти этот пакет, и мне просто любопытно, как это работает. Я использовал команду locate, чтобы попытаться найти org.w3c.dom, но ничего не получил. Где находятся эти пакеты? Мне кажется, что правильным местом для поиска будет переменная среды CLASSPATH, поскольку мои результаты поиска, похоже, предполагают это. Правильно ли это? В любом случае, я не знаю, как узнать, какова моя переменная CLASSPATH . Похоже, это не переменная среды, о которой знает моя оболочка.
Комментарии:
1. мое мнение — плохая идея использовать переменную среды CLASSPATH в любом случае. Лучше передать параметр -classpath либо в java, либо в javac.
Ответ №1:
Это будет частью основных библиотек ( rt.jar
), поэтому оно будет везде, где вы установили java JRE; в частности, в разделе $JAVA_HOME/jre/lib
Вы можете заглянуть внутрь .jar
файлов с помощью jar
команды. Чтобы увидеть класс, который вы упомянули, вы можете сделать:
jar tvf rt.jar
Здесь перечислены все классы в этом jar.
Обратите внимание, что это местоположение автоматически ищется JVM — оно не требуется и не включено в переменную среды CLASS_PATH . (Вы могли бы добавить его, но это было бы просто излишним)
Отредактируйте для ясности:
JVM <Where_you_installed_jdk>/jre/lib
<Where_you_installed_jdk>/jre/lib/ext
по умолчанию включает и . Все остальное должно быть явно добавлено вами, либо передав его в java напрямую через -cp
параметр, либо добавив его в переменную CLASS_PATH
среды.
Документацию по relavent можно найти по адресу: http://download.oracle.com/javase/6/docs/technotes/tools/findingclasses.html
Комментарии:
1. Я нашел rt.jar используя locate, потому что у меня нет переменной окружения JAVA_HOME. Проблема в том, что у меня нет этой переменной среды? Для чего это нужно и кто отвечает за его настройку?
2. @bhh1988 — Я просто использовал JAVA_HOME в своем ответе, чтобы проиллюстрировать, где находится файл; Я понятия не имею, где вы установили java на свой компьютер 😉 Как и CLASS_PATH, он также не нужен для запуска программ Java — подобно тому, как я использовал его в своем примере, он обычно используется для других целей, чтобы иметь возможность найти, где вы установили java на свой компьютер.
3.
CLASSPATH
, неCLASS_PATH
4. Большое спасибо за упоминание команды jar tvf. Для новичка в Java было очень сложно определить, как получить имена пакетов, которые содержатся в jar, и это очень помогло.
Ответ №2:
JVM находит классы, используя параметры classpath, в которых заданы все пути к требуемым пакетам. Путь к классу может быть задан несколькими способами. Первая упомянутая вами переменная окружения CLASSPATH . Это необязательно и может быть отключено. Второй способ — это явная опция «-cp» для исполняемого файла «java».
Также некоторые JAR-файлы среды выполнения JRE добавляются в classpath по умолчанию неявно, поэтому вам не нужно самостоятельно искать и добавлять стандартные пакеты (в частности, тот, который вы упомянули в своем вопросе).
Комментарии:
1. я понимаю. Существуют ли какие-либо другие банки, которые добавляются неявно? Где я могу найти список тех jar, которые неявно добавляются в путь к классу? И как просмотреть мой путь к классу?
2. Ну, на самом деле вы можете заглянуть в свой установочный каталог JDK, чтобы проверить банки времени выполнения (rt.jar ). Но эти банки не отображаются в classpath, поскольку они являются частью библиотеки Java runtime library.
Ответ №3:
попробуйте скомпилировать messconvener.java например, из его собственного каталога
javac -d ..... -cp ..... messconvener.java
-d — создает структуру каталогов для вашего пакета
-cp — предоставляет путь к классу для пользовательского файла, где он может найти определенные пользователем классы