Задаване на пътя на класа

Пътят на класа е пътят, който средата за изпълнение на Java търси за класове и други файлове с ресурси. Пътят за търсене на клас (по-известен с по-краткото име, "classpath") може да бъде зададен с помощта на опцията -classpath, чрез извикване на инструмента JDK (предпочитан метод) или чрез задаване на променливата на средата CLASSPATH. Опцията -classpath е предпочитана, защото можете да я зададете за всяко приложение, без да засяга други приложения и без други приложения да променят стойността му.

%setenv CLASSPATHclasspath1:classpath2.

sdkToolИнструмент за команден ред като java, javac, javadoc или apt. Вижте JDK Tools за списък.classpath1:classpath2Classpaths към .jar.zip или .class файлове. Всекиclasspathтрябва да завършва с име на файл или директория в зависимост от това на какво сте задали classpath:

  • За .jar или .zip файл, който съдържа .class файлове, classpath завършва с името на .zip или .jar файла.
  • За .class файлове в ненаименован пакет пътят на класа завършва с директорията, която съдържа .class файловете.
  • За .class файлове в наименуван пакет пътят на класа завършва с директорията, която съдържа "root" пакета (първия пакет в пълното име на пакета).

Различните записи на пътя са разделени с двоеточие.

Класът по подразбиране е текущата директория. Задаването на променливата CLASSPATH или използването на опцията на командния ред -classpath отменя стойността по подразбиране, така че ако искате да включите текущата директория в пътя за търсене, трябва давключите "."в новите настройки.

Игнорирайте записи в classpath, които не са нито директории, нито архиви (.zipили .jar файлове), нито *.

Classpath казва на инструментите и приложенията на JDK къде да намерят класове от трети страни и дефинирани от потребителя - тоест класове, които не са разширения или част от платформата Java. Пътят на класа трябва да намери всички класове, които сте компилирали с компилатора на javac - по подразбиране е текущата директория, за да позволи удобно тези класове да бъдат намерени.

JDK, JVM и други инструменти за JDK намират класове, като търсят класове на платформата Java (bootstload), всички класове за разширение и пътя на класа в този ред. (За повече информация относно стратегията за търсене вижте Как се намират класове.) Библиотеките с класове за повечето приложения ще искат да се възползват от механизма за разширение. Трябва да зададете пътя на класа само когато искате да заредите клас, който (а) не е в текущата директория или някоя от нейните поддиректории и (б) не е на място, посочено от механизма за разширение.

Ако надграждате от по-стара версия на JDK, вашите настройки за стартиране може да включват настройки на CLASSPATH, които вече не са необходими. Трябва да премахнете всички настройки, които не са специализирани, като classes.zip. Някои приложения на трети страни, които използват виртуалната машина на Java, може да променят вашата променлива на средата CLASSPATH, за да включват библиотеките, които използват. Такива настройки може да останат.

Можете да промените classpath, когато използвате JDK инструментите - опцията classpath, когато извиквате JVM или други JDK инструменти или когато използвате променливата на средата CLASSPATH. Използването на опцията -classpath е за предпочитане пред настройването на променливата на средата CLASSPATH, защото можете да зададете това индивидуално за всяко приложение, без да засягате други приложения и бездруги приложения, които променят стойността му.

Класовете могат да се записват както в директории (папки), така и в архивни файлове. Класовете на платформата Java се съхраняват в rt.jar. За повече информация относно архивите и информация как работи classpath, вижте Разбиране на classpath и имената на пакети в края на този документ.

Важна забележка:Някои по-стари версии на софтуера JDK включвахаjdk-dir>/classes запис в класовата пътека по подразбиране. Тази директория съществува за използване от JDK софтуера и не трябва да се използва за класове на приложения. Класовете на приложението трябва да бъдат поставени в директория извън йерархията на JDK директорията. По този начин инсталирането на нов JDK не ви принуждава да преинсталирате класове на приложения. За съвместимост с по-стари версии приложенията, които използват директориятаjdk-dir>/classes като библиотека с класове, ще работят в текущата версия, но няма гаранция, че ще работят в бъдещи версии.

Използване на JDK инструменти - classpath опция

Инструментът за изпълнение на Java също има опция-cp. Тази опция е съкращение за-classpath.

За много специални случаи и java, и javac имат опции, които ви позволяват да промените пътя, който използват, за да намерят собствените си библиотеки с класове. По-голямата част от потребителите обаче никога няма да трябва да използват тези опции.

Използване на променливата на средата CLASSPATH

Като цяло ще искате да използвате опцията на командния ред -classpath, както е обяснено в предишния раздел. Този раздел ви показва как да зададете променливата на средата CLASSPATH, ако желаете да го направите, или да изчиститенастройки, пренесени от предишна инсталация.

Задаване на CLASSPATH

В csh променливата на средата CLASSPATH се променя с командатаsetenv. формат:

В sh, променливата на средата CLASSPATH може да бъде променена с тези команди:

Изчистване на CLASSPATH

Ако вашата променлива на средата CLASSPATH е зададена на стойност, която не е правилна, или ако вашият стартиращ файл или скрипт задава грешен път, можете да нулирате CLASSPATH в csh, като използвате:

В sh бихте използвали:

Тези команди нулират CLASSPATH само за текущата обвивка. Трябва също да премахнете или промените настройките си за стартиране, за да сте сигурни, че имате правилните настройки на CLASSPATH в бъдещи сесии.

Промяна на настройките за стартиране

Ако променливата CLASSPATH е зададена при стартиране на системата, мястото, където да я търсите, зависи от обвивката, която изпълнявате:

Разбиране на заместващите символи на пътя на класа

Записите в Classpath могат да съдържат заместващия знак * на основното име, което се счита за еквивалентно на посочване на списък с всички файлове в директория с разширение .jar или .JAR. Например записът на пътеката на класа foo/* указва всички JAR файлове в директорията с име foo. Записът на classpath, състоящ се просто от *, се разширява до списък на всички файлове на колбата в текущата директория. Файловете ще бъдат разглеждани независимо дали са скрити (т.е. имат имена, започващи с '.').

Запис в classpath, който съдържа *, няма да съответства на клас файлове. Свържете двата класа и JAR файловете в една директория foo , използвайте или foo:foo/* или foo/*:foo . Избраният ред определя дали класовете и ресурсите във foo се зареждат преди JAR файловете във foo или обратното.

Поддиректориите не сатърсено рекурсивно. Например foo/* търси само JAR файлове във foo, а не foo/bar, foo/baz и т.н.

Редът, в който JAR файловете в дадена директория са изброени в разширения класов път, не е посочен и може да варира от платформа на платформа и дори от точка до точка на една и съща машина. Добре проектираното приложение не трябва да зависи от определена поръчка. Ако се изисква специфичен ред, тогава JAR файловете могат да бъдат изрично изброени в classpath.

Разширяването на заместващи символи се извършва рано преди извикването на основния метод на програмата, а не късно по време на самия процес на зареждане на класа. Всеки елемент от пътя на входния клас, съдържащ заместващия знак, се заменя с (евентуално празна) последователност от елементи, генерирани чрез изброяване на JAR файловете в наименуваната директория. Например, ако директорията foo съдържа a.jar, b.jar и c.jar, тогава classpath foo/* се разширява до foo/a.jar:foo/b.jar:foo/c.jar и този низ ще бъде стойността на системното свойство java.class.path.

Променливата на средата CLASSPATH не се третира по различен начин от опцията на командния ред -classpath (или -cp). По този начин заместващите знаци се зачитат във всички тези случаи. Обаче заместващите символи на classpath не зачитат jar-explicit заглавката в Class-Path.

Разбиране на classpath и имена на пакети

Java класовете са организирани в пакети, които се свързват с директории във файловата система. Но за разлика от файловата система, всеки път, когато указвате име на пакет, вие указватецялотоиме на пакета - никога част от него. Например името на пакета за java.awt.Buttonе винагисе дефинира като java.awt.

Да предположим например, че искате Java Runtime да намери клас с име Cool.class в пакетаutility.myapp. Ако пътят до тази директория е /java/MyClasses/utility/myapp, бихте задали пътя на класа да съдържа /java/MyClasses.

За да изпълните това приложение, можете да използвате следната JVM команда:

%java -classpath /java/MyClasses utility.myapp.Cool

Когато приложението работи, JVM използва настройките на classpath, за да прочете всички други класове, дефинирани в пакета utility.myapp, които се използват от класа Cool.

Имайте предвид, че цялото име на пакета е посочено в командата. Не е възможно, например, да зададете classpath, така че той съдържа /java/MyClasses/utility и използвайте командата java myapp.Cool. Класът нямаше да бъде намерен.

(Човек може да се чуди какво определя име на пакет за клас. Отговорът е, че името на пакета е част от класа и не може да бъде променено, освен чрез прекомпилиране на класа.)

Забележка:Интересна последица от механизма за спецификация на пакета е, че файловете, които са част от един и същ пакет, може действително да съществуват в различни директории. Името на пакета ще бъде едно и също за всеки клас, но пътят до всеки файл може да започва от различна директория в пътя на класа.

Папки и архивни файлове

Когато класовете се съхраняват в директория (папка), като /java/MyClasses/utility/myapp, тогава входът на пътя на класа сочи към директорията, която съдържа първия елемент от името на пакета. (в този случай /java/MyClasses, тъй като името на пакета е utility.myapp.)

Но когато класовете се съхраняват в архивен файл (.zip или .jar файл), записът в пътя на класа е пътят към и включително файла .zip или .jar. Например, за да използвате библиотека от класове, която е в .jar файл, командата ще изглежда така:

%java -classpath /java/MyClasses/myclasses.jarutility.myapp.Cool

Множество спецификации

За да намерите файловете на класовете в директорията /java/MyClasses, както и класовете в /java/OtherClasses, трябва да зададете classpath на:

%java -classpath /java/MyClasses:/java/OtherClasses.

Имайте предвид, че двата пътя са разделени с двоеточие.

Спецификация ред

Редът, в който посочвате множество записи на classpath, е важен. Интерпретаторът на Java ще търси класове в директориите в реда, в който се появяват в променливата на пътя на класа. В примера по-горе интерпретаторът на Java първо ще потърси необходимия клас в директорията /java/MyClasses. Само ако не намери клас с подходящо име в тази директория, интерпретаторът ще търси в директорията /java/OtherClasses.