Spec-Zone .ru
спецификации, руководства, описания, API
|
Путь к классу является путем, что среда выполнения Java ищет классы и другие файлы ресурсов. Путь поиска класса (более обычно известный более коротким именем, "путем к классу") может быть установлен, используя любого -classpath
опция, вызывая инструмент JDK (привилегированный метод) или устанавливая CLASSPATH
переменная окружения. -classpath
опция предпочитается, потому что можно установить ее индивидуально для каждого приложения, не влияя на другие приложения и без других приложений, изменяющих его значение.
%
sdkTool -classpath
classpath1:
classpath2...
- или
% setenv CLASSPATH
classpath1:
classpath2...
где:
java
, javac
, javadoc
, или apt
. Для перечисления см. Инструменты JDK.:
classpath2Записи разнообразного пути разделяются двоеточиями.
Путь к классу по умолчанию является текущим каталогом. Установка CLASSPATH
переменная или использование -classpath
переопределения параметра командной строки, которые значение по умолчанию, так, если Вы хотите включать текущий каталог в путь поиска, следует включать "." в новые настройки.
Игнорируются записи пути к классу, которые не являются ни каталогами, ни архивами (.zip или.jar файлы), ни *.
Путь к классу говорит инструменты JDK и приложения, где найти сторонние и определяемые пользователем классы - то есть, классы, которые не являются расширениями или частью платформы Java. Путь к классу должен найти любые классы, которые Вы скомпилировали с javac компилятором - его значение по умолчанию является текущим каталогом, чтобы удобно позволить тем классам быть найденными.
JDK, JVM и другие инструменты JDK находят классы, ища платформу Java (начальная загрузка) классы, любые классы расширения, и путь к классу, в том порядке. (Для получения дополнительной информации на поисковой стратегии, см., Как Классы Находятся.) Библиотеки классов для большинства приложений будут хотеть использовать в своих интересах механизм расширений. Вы только должны установить путь к классу, когда Вы хотите загрузить класс, это (a) не в текущем каталоге или в любом из его подкаталогов, и (b) не в расположении, определенном механизмом расширений.
Если Вы обновляете от более старой версии JDK, Ваши настройки запуска могут включать CLASSPATH
настройки, которые больше не необходимы. Следует удалить любые настройки, которые не специализированы, такой как classes.zip
. Некоторые сторонние приложения, которые используют виртуальную машину Java, могут изменить Ваш CLASSPATH
переменная окружения, чтобы включать libaries они используют. Такие настройки могут остаться.
Можно изменить путь к классу при использовании инструментов JDK - опция пути к классу, когда Вы вызываете JVM или другие инструменты JDK или при использовании CLASSPATH
переменная окружения. Используя -classpath
опция предпочитается по установке CLASSPATH
переменная окружения, потому что можно установить это индивидуально для каждого приложения, не влияя на другие приложения и без других приложений, изменяющих его значение.
Классы могут быть сохранены или в каталогах (папки) или в архивных файлах. Классы платформы Java сохранены в rt.jar
. Для получения дополнительной информации на архивах и информации о том, как путь к классу работает, см. Понимание пути к классу и имен пакета около конца этого документа.
Важное Примечание: Некоторые более старые версии программного обеспечения JDK включенный a <
jdk-dir>/classes
запись в пути к классу по умолчанию. Тот каталог существует для использования программным обеспечением JDK, и не должен использоваться для классов приложений. Классы приложений должны быть помещены в каталог за пределами JDK direcotry иерархия. Тот путь, устанавливая новый JDK не вынуждает Вас переустановить классы приложений. Для совместимости с более старыми версиями, приложения, которые используют <
jdk-dir>/classes
каталог как библиотека классов будет работать в текущей версии, но нет никакой гарантии, что они будут работать в будущих версиях.
У java инструментов Java, jdb, javac, и javah есть a -classpath
опция, которая заменяет путь или соединяет каналом определенный CLASSPATH
переменная окружения, в то время как инструмент работает. Это - рекомендуемая опция для того, чтобы изменить настройки пути к классу, потому что у каждого приложения может быть путь к классу, в котором это нуждается, не вмешиваясь ни в какое другое приложение.
У java инструмента времени выполнения есть a -cp
опция, также. Эта опция является сокращением для -classpath
.
Для совершенно особых случаев у и java и javac есть опции, которые позволяют Вам изменять путь, который они используют, чтобы найти их собственные библиотеки классов. Огромное большинство пользователей не будет, чтобы никогда не должно использовать те опции, как бы то ни было.
Вообще, Вы будете хотеть использовать -classpath
параметр командной строки, как объяснено в предыдущем разделе. Этот раздел показывает Вам, как установить CLASSPATH
переменная окружения, если Вы хотите сделать это, или четкие настройки, перенесенные от предыдущей установки.
В csh, CLASSPATH
переменная окружения изменяется с setenv
команда. Формат:
setenv CLASSPATH
path1:
path2
В sh, CLASSPATH
переменная окружения может быть изменена с этими командами:
CLASSPATH =
path1:
path2:
...
export CLASSPATH
Если Ваш CLASSPATH
переменная окружения была установлена в значение, которое не корректно, или если Ваш файл запуска или сценарий устанавливают неправильный путь, можно сбросить CLASSPATH
в csh при использовании:
unsetenv CLASSPATH
В sh Вы использовали бы:
unset CLASSPATH
Эти команды сбрасываются CLASSPATH
для текущей оболочки только. Следует также удалить или изменить свои настройки запуска, чтобы гарантировать, что Вы имеете право CLASSPATH
настройки в будущих сеансах.
Если CLASSPATH
переменная устанавливается при системном запуске, место, чтобы искать это зависит от оболочки, которую Вы выполняете:
Shell | Сценарий запуска |
---|---|
csh, tcsh | Исследуйте Ваш .cshrc файл для setenv команда. |
sh, ksh | Исследуйте Ваш .profile файл для export команда. |
Записи пути к классу могут содержать подстановочный символ базового имени *, который считают эквивалентным определению списка всех файлов в каталоге с расширением .jar
или .JAR
. Например, запись пути к классу foo/*
определяет все файлы JAR в названном каталоге foo
. Запись пути к классу, состоящая просто из *, расширяется до списка всех файлов фляги в текущем каталоге. Файлы рассмотрят независимо от того, скрываются ли они (то есть, имейте начинающиеся '.' имена).
Запись пути к классу, которая содержит *, не будет соответствовать файлы класса. Соответствовать оба класса и файлы JAR в единственном каталоге foo
, используйте также foo:foo/*
или foo/*:foo
. Выбранный порядок определяет ли классы и ресурсы в foo
загружаются перед файлами JAR в foo
, или наоборот.
Подкаталоги не ищутся рекурсивно. Например, foo/*
ищет файлы JAR только в foo
, не в foo/bar
, foo/baz
, и т.д..
Порядок, в котором файлы JAR в каталоге перечисляются в расширенном пути к классу, не определяется и может измениться от платформы до платформы и даже с момента до момента на той же самой машине. Хорошо созданное приложение не должно зависеть ни от какого определенного порядка. Если определенный порядок требуется тогда, файлы JAR могут быть перечислены явно в пути к классу.
Расширение подстановочных знаков делается рано до вызова программы main
метод, а не поздно, во время процесса загрузки класса непосредственно. Каждый элемент входного пути к классу, содержащего подстановочный знак, заменяется (возможно пустой) последовательность элементов, сгенерированных, перечисляя файлы JAR в именованном каталоге. Например, если каталог foo
содержит a.jar
, b.jar
, и c.jar
, тогда путь к классу foo/*
расширяется в foo/a.jar:foo/b.jar:foo/c.jar
, и та строка была бы значением системного свойства java.class.path
.
CLASSPATH
переменная окружения не обрабатывается никто по-другому от -classpath
(или -cp
) параметр командной строки. Таким образом, подстановочные знаки соблюдают во всех этих случаях. Однако, подстановочные знаки пути к классу не соблюдают в Class-Path
явный флягой заголовок.
Классы Java организуются в пакеты, которые отображаются на каталоги в файловой системе. Но, в отличие от файловой системы, всякий раз, когда Вы определяете имя пакета, Вы определяете целое имя пакета - никогда часть его. Например, имя пакета для java.awt.Button
всегда определяется как java.awt
.
Например, предположите, что Вы хотите, чтобы Среда выполнения Java сочла класс названным Cool.class
в пакете utility.myapp
. Если путь к тому каталогу /java/MyClasses/utility/myapp
, Вы установили бы путь к классу так, чтобы он содержал /java/MyClasses
.
Чтобы выполнить то приложение, Вы могли использовать следующую команду JVM:
% java -classpath /java/MyClasses utility.myapp.Cool
Когда приложение работает, JVM использует настройки пути к классу, чтобы счесть любые другие классы определенными в utility.myapp
пакет, которые используются Cool
класс.
Отметьте, что все имя пакета определяется в команде. Не возможно, например, установить путь к классу, таким образом, это содержит /java/MyClasses/utility
и используйте команду java myapp.Cool
. Класс не был бы найден.
(Можно задаваться вопросом, что определяет имя пакета для класса. Ответ - то, что имя пакета является частью класса и не может быть изменено, кроме, перекомпилировав класс.)
Отметьте: интересное последствие механизма спецификации пакета - то, что файлы, которые являются частью того же самого пакета, могут фактически существовать в различных каталогах. Имя пакета будет тем же самым для каждого класса, но путь к каждому файлу может запуститься с различного каталога в пути к классу.
Когда классы сохранены в каталоге (папка), как /java/MyClasses/utility/myapp
, тогда точки входа пути к классу к каталогу, который содержит первый элемент имени пакета. (в этом случае, /java/MyClasses
, так как имя пакета utility.myapp
.)
Но когда классы сохранены в архивном файле (.zip или.jar файл), запись пути к классу является путем к и включая.zip или.jar файл. Например, чтобы использовать библиотеку классов, которая находится в.jar файле, команда выглядела бы примерно так:
% java -classpath /java/MyClasses/myclasses.jar utility.myapp.Cool
Найти файлы класса в каталоге /java/MyClasses
так же как классы в /java/OtherClasses
, Вы установили бы путь к классу в:
% java -classpath /java/MyClasses:/java/OtherClasses ...
Отметьте, что два пути разделяются двоеточием.
Порядок, в котором Вы определяете многократные записи пути к классу, важен. Интерпретатор Java будет искать классы в каталогах в порядке, они появляются в переменной пути к классу. В примере выше, интерпретатор Java будет сначала искать необходимый класс в каталоге /java/MyClasses
. Только если это не находит, что класс с именем собственным в том каталоге будет интерпретатор заглядывать /java/OtherClasses
каталог.