В этой статье есть несколько проблем. Помогите улучшить ее или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти сообщения )
|
Classpath — это параметр в виртуальной машине Java или компиляторе Java , который указывает местоположение пользовательских классов и пакетов . Параметр может быть установлен либо в командной строке , либо через переменную окружения .
Подобно классическому поведению динамической загрузки , при выполнении программ Java виртуальная машина Java находит и загружает классы лениво (загружает байт-код класса только при первом использовании класса). Classpath сообщает Java, где искать в файловой системе файлы, определяющие эти классы.
Виртуальная машина ищет и загружает классы в следующем порядке:
jre/lib/ext/
По умолчанию доступны только пакеты стандартного API JDK и пакеты расширений без необходимости указывать, где их искать. Путь для всех пользовательских пакетов и библиотек должен быть установлен в командной строке (или в манифесте , связанном с файлом Jar, содержащим классы).
Предположим, у нас есть пакет org.mypackage, содержащий классы:
и файлы, определяющие этот пакет, физически хранятся в каталоге D:\myprogram (в Windows ) или /home/user/myprogram (в Linux ).
Структура файла выглядит так:
Майкрософт Виндоус | линукс |
---|---|
D:\мояпрограмма\ | ---> орг\ | ---> мойпакет\ | ---> HelloWorld.класс ---> SupportClass.класс ---> UtilClass.класс | /home/user/myprogram/ | ---> орг/ | ---> мойпакет/ | ---> HelloWorld.класс ---> SupportClass.класс ---> UtilClass.класс |
Когда мы вызываем Java, мы указываем имя приложения для запуска: org.mypackage.HelloWorld. Однако мы также должны указать Java, где искать файлы и каталоги, определяющие наш пакет. Поэтому для запуска программы мы используем следующую команду:
Майкрософт Виндоус | линукс |
---|---|
java -classpath D:\myprogram org.mypackage.HelloWorld | java -cp /home/user/myprogram org.mypackage.HelloWorld |
где:
java
— это средство запуска среды выполнения Java , тип инструмента SDK (инструмент командной строки, такой как javac , javadoc или apt )Переменная окружения named CLASSPATH
может быть альтернативно использована для установки classpath. Для приведенного выше примера мы также могли бы использовать в Windows:
D:\myprogram> set CLASSPATH = D:\myprogram D:\myprogram> java org.mypackage.HelloWorld
Правило заключается в том -classpath
, что при использовании параметра для запуска приложения Java он переопределяет CLASSPATH
переменную окружения. Если ничего не указано, в качестве classpath используется текущий рабочий каталогD:\myprogram\
. Это означает, что когда наш рабочий каталог (в Linux, /home/user/myprogram/
), нам не нужно будет явно указывать classpath. Однако при переопределении рекомендуется включать текущую папку "."
в classpath в случае, если требуется загрузка классов из текущей папки.
То же самое относится не только к java launcher, но и к javac , компилятору Java.
Если программа использует вспомогательную библиотеку, заключенную в Jar-файл с именем supportLib.jar , физически расположенный в каталоге D:\myprogram\lib\, и соответствующая физическая структура файла выглядит следующим образом:
D:\мояпрограмма\ | ---> библиотека\ | ---> supportLib.jar | ---> орг\ | ---> мойпакет\ | ---> HelloWorld.класс ---> SupportClass.класс ---> UtilClass.класс
необходима следующая опция командной строки :
java -classpath D:\myprogram;D:\myprogram\lib\supportLib.jar org.mypackage.HelloWorld
или альтернативно:
D:\myprogram> set CLASSPATH = D:\myprogram;D:\myprogram\lib\supportLib.jar D:\myprogram> java org.mypackage.HelloWorld
В Java 6 и выше можно добавить все jar-файлы в определенном каталоге в classpath, используя подстановочные знаки.
Пример для Windows:
D:\myprogram> java -classpath ".;c:\mylib\*" МоеПриложение
Пример для Linux:
$ java -classpath '.:/mylib/*' МоеПриложение
Это работает как для -classpath
параметров, так и для путей к классам среды.
Если программа заключена в Jar-файл с именем helloWorld.jar , расположенный непосредственно в каталоге D:\myprogram , то структура каталогов будет следующей:
D:\мояпрограмма\ | ---> helloWorld.jar | ---> библиотека\ | ---> supportLib.jar
Файл манифеста , определенный в helloWorld.jar, имеет следующее определение:
Основной класс : org.mypackage.HelloWorld Путь к классу : lib/supportLib.jar
Файл манифеста должен заканчиваться либо новой строкой, либо возвратом каретки.
Программа запускается следующей командой:
java -jar D:\myprogram\helloWorld.jar [аргументы приложения]
Это автоматически запускает org.mypackage.HelloWorld , указанный в классе Main-Class с аргументами. Пользователь не может заменить это имя класса с помощью вызова java -jar
. Class-Path описывает расположение supportLib.jar относительно расположения библиотеки helloWorld.jar . Ни абсолютный путь к файлу, который разрешен в -classpath
параметре командной строки, ни внутренние пути jar не поддерживаются. Это означает, что если файл основного класса содержится в jar, org/mypackage/HelloWorld.class должен быть допустимым путем в корне внутри jar.
Несколько записей classpath разделяются пробелами:
Путь к классу : lib/supportLib.jar lib/supportLib2.jar
Синтаксис командной строки Classpath тесно связан с файловой системой и зависит от операционной системы. [1] Например:
Это не применяется, если Classpath определен в файлах манифеста , где каждый путь к файлу должен быть разделен пробелом (" "), независимо от операционной системы.