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