Java Language
Путь Класса
Поиск…
Вступление
замечания
Загрузка класса Java
JVM (виртуальная машина Java) будет загружать классы как и когда требуются классы (это называется ленивой загрузкой). Местоположения классов, которые будут использоваться, указаны в трех местах:
- Сначала загружаются те, которые требуются платформой Java, например, в библиотеке классов Java и ее зависимостях.
- Далее загружаются классы расширения (т.
jre/lib/ext/
Те, что указаны вjre/lib/ext/
) - Затем загружаются пользовательские классы через путь к классам
Классы загружаются с использованием классов, которые являются подтипами java.lang.ClassLoader
. Это описано более подробно в этой теме: Classloaders .
Classpath
Путь к классам - это параметр, используемый JVM или компилятором, который определяет расположение пользовательских классов и пакетов. Это можно установить в командной строке, как в большинстве этих примеров, или через переменную окружения ( CLASSPATH
)
Различные способы указания пути к классам
Существует три способа установки пути к классам.
Его можно установить с помощью переменной среды
CLASSPATH
:set CLASSPATH=... # Windows and csh export CLASSPATH=... # Unix ksh/bash
Его можно установить в командной строке следующим образом
java -classpath ... javac -classpath ...
Обратите внимание, что параметр
-classpath
(или-cp
) имеет приоритет над переменной средыCLASSPATH
.Путь классов для исполняемого файла JAR указывается с помощью элемента
Class-Path
вMANIFEST.MF
:Class-Path: jar1-name jar2-name directory-name/jar3-name
Обратите внимание, что это применяется только тогда, когда файл JAR выполняется следующим образом:
java -jar some.jar ...
В этом режиме выполнения параметр
-classpath
и переменная среды CLASSPATH будут игнорироваться, даже если в JAR-файле нет элементаClass-Path
.
Если classpath не указан, то java -jar
по умолчанию - это выбранный JAR-файл при использовании java -jar
или текущего каталога в противном случае.
Связанные с:
- https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
- http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
Добавление всех JAR в каталог к пути к классам
Если вы хотите добавить все JAR-файлы в каталог в путь к классам, вы можете сделать это в сжатом виде с помощью синтаксиса подстановочных знаков класса; например:
someFolder/*
Это сообщает JVM добавлять все JAR и ZIP-файлы в каталог someFolder
в someFolder
к классам. Этот синтаксис может быть использован в -cp
аргумента, в CLASSPATH
переменной окружения, или Class-Path
атрибут в явном file.See виде исполняемого JAR - файла Настройка пути к классам: Путь класса Wild Cards для примеров и предостережений.
Заметки:
- Классовые маски классов были впервые введены в Java 6. Ранние версии Java не рассматривают «*» как подстановочный знак.
- Вы не можете вводить другие символы до или после « »; например, «someFolder / .jar» не является подстановочным знаком.
- Подстановочный знак соответствует только файлам с суффиксом «.jar» или «.JAR». Файлы ZIP игнорируются, как и файлы JAR с разными суффиксами.
- Подстановочный знак соответствует только JAR-файлам в самом каталоге, а не в его подкаталогах.
- Когда группа файлов JAR сопоставляется с подстановочной записью, их относительный порядок в пути к классам не указан.
Синтаксис пути к классу
Путь к классам - это последовательность записей, которые являются именами путей каталогов, JAR или файловыми файлами ZIP или спецификациями подстановки JAR / ZIP.
Для пути
-classpath
указанного в командной строке (например,-classpath
) или в качестве переменной среды, записи должны быть разделены;
(точки с запятой) в Windows, или:
(двоеточие) символов на других платформах (Linux, UNIX, MacOSX и т. д.).Для элемента
Class-Path
в файлеMANIFEST.MF
файла JAR используйте одно пространство для разделения записей.
Иногда необходимо вставить пробел в элемент pathpath
Когда путь класса указан в командной строке, это просто вопрос использования соответствующего цитирования оболочки. Например:
export CLASSPATH="/home/user/My JAR Files/foo.jar:second.jar"
(Детали могут зависеть от используемой командной оболочки.)
Когда путь класса указан в файле JAR файла «MANIFEST.MF», необходимо использовать кодировку URL.
Class-Path: /home/user/My%20JAR%20Files/foo.jar second.jar
Динамический путь класса
Иногда просто добавить все JAR из папки недостаточно, например, когда у вас есть собственный код и вам нужно выбрать подмножество JAR. В этом случае вам понадобятся два метода main()
. Первый построит загрузчик классов, а затем использует этот загрузчик классов для вызова второго main()
.
Вот пример, который выбирает правильный JAR для SWT для вашей платформы, добавляет все JAR-приложения вашего приложения, а затем вызывает реальный метод main()
: создание кросс-платформенного приложения Java SWT
Загрузка ресурса из пути к классам
Может быть полезно загрузить ресурс (изображение, текстовый файл, свойства, KeyStore, ...), который упакован внутри JAR. Для этой цели мы можем использовать Class
и ClassLoader
s.
Предположим, что мы имеем следующую структуру проекта:
program.jar
|
\-com
\-project
|
|-file.txt
\-Test.class
И мы хотим получить доступ к содержимому file.txt
из класса Test
. Мы можем сделать это, запросив загрузчик классов:
InputStream is = Test.class.getClassLoader().getResourceAsStream("com/project/file.txt");
Используя загрузчик классов, мы должны указать полный путь нашего ресурса (каждый пакет).
Или, альтернативно, мы можем напрямую спросить объект класса Test
InputStream is = Test.class.getResourceAsStream("file.txt");
Используя объект класса, путь относится к самому классу. Наш Test.class
находящийся в пакете com.project
, так же, как file.txt
, нам не нужно указывать какой-либо путь вообще.
Однако мы можем использовать абсолютные пути от объекта класса, например:
is = Test.class.getResourceAsStream("/com/project/file.txt");
Сопоставление имен классов с именами путей
Стандартная инструментальная цепочка Java (и сторонние инструменты, предназначенные для взаимодействия с ними) имеют определенные правила для сопоставления имен классов с именами файлов и других ресурсов, которые их представляют.
Отображения таковы:
- Для классов в пакете по умолчанию пути являются простыми именами файлов.
- Для классов в именованном пакете компоненты имени пакета отображаются в каталогах.
- Для названных вложенных и внутренних классов компонент имени файла формируется путем объединения имен классов с символом
$
. - Для анонимных внутренних классов вместо имен используются числа.
Это проиллюстрировано в следующей таблице:
Classname | Исходный путь | Путь к файлу класса |
---|---|---|
SomeClass | SomeClass.java | SomeClass.class |
com.example.SomeClass | com/example/SomeClass.java | com/example/SomeClass.class |
SomeClass.Inner | (в SomeClass.java ) | SomeClass$Inner.class |
SomeClass anon внутренние классы | (в SomeClass.java ) | SomeClass$1.class , SomeClass$2.class и т. Д. |
Что означает classpath: как работают поисковые запросы
Цель classpath - указать JVM, где можно найти классы и другие ресурсы. Значение classpath и процесс поиска переплетаются.
Путь к классам - это форма пути поиска, которая определяет последовательность местоположений для поиска ресурсов. В стандартном classpath эти места представляют собой либо каталог в файловой системе хоста, файл JAR, либо ZIP-файл. В каждом случае местоположение является корнем пространства имен, которое будет искать.
Стандартная процедура поиска класса в пути к классам выглядит следующим образом:
Сопоставьте имя класса с относительным именем класса
RP
. Отображение имен классов для имен файлов классов описано в другом месте.Для каждой записи
E
в пути к классам:- Если запись является файловой системой:
- Решите
RP
относительноE
чтобы дать абсолютный путьAP
. - Проверьте, является ли
AP
для существующего файла. - Если да, загрузите класс из этого файла
- Решите
- Если запись является JAR или ZIP-файлом:
- Поиск
RP
в индексе файла JAR / ZIP. - Если соответствующая запись JAR / ZIP-файла существует, загрузите класс из этой записи.
- Поиск
- Если запись является файловой системой:
Процедура поиска ресурса в пути к классам зависит от того, является ли путь ресурса абсолютным или относительным. Для абсолютного пути ресурса процедура выполняется так же, как указано выше. Для пути относительного ресурса, разрешенного с использованием Class.getResource
или Class.getResourceAsStream
, путь к пакету классов добавляется перед поиском.
(Обратите внимание, что это процедуры, выполняемые стандартными загрузчиками классов Java. Пользовательский загрузчик классов может выполнять поиск по-разному.)
Путь к бутстрапу
Обычные загрузчики классов Java ищут классы сначала в пути класса bootstrap, прежде чем проверять расширения и путь класса приложения. По умолчанию путь bootstrap classpath состоит из файла «rt.jar» и некоторых других важных файлов JAR, которые поставляются установкой JRE. Они обеспечивают все классы стандартной стандартной библиотеки классов Java SE, а также различные «внутренние» классы реализации.
При нормальных обстоятельствах вам не нужно беспокоиться об этом. По умолчанию команды java
, javac
и т. Д. Будут использовать соответствующие версии библиотек времени исполнения.
Очень редко необходимо переопределить нормальное поведение среды выполнения Java, используя альтернативную версию класса в стандартных библиотеках. Например, вы можете столкнуться с ошибкой «show stopper» в библиотеках времени выполнения, с которыми вы не можете работать обычными способами. В такой ситуации можно создать JAR-файл, содержащий измененный класс, а затем добавить его в путь класса bootstrap, который запускает JVM.
Команда java
предоставляет следующие опции -X
для изменения пути класса bootstrap:
-
-Xbootclasspath:<path>
заменяет текущий путь к пути загрузки указанным путем. -
-Xbootclasspath/a:<path>
добавляет предоставленный путь к текущему пути к загрузке. -
-Xbootclasspath/p:<path>
добавляет предоставленный путь к текущему пути к загрузке.
Обратите внимание, что при использовании параметров bootclasspath для замены или переопределения класса Java (etcetera) вы технически модифицируете Java. При распространении кода могут возникнуть последствия для лицензирования. (Обратитесь к положениям и условиям бинарной лицензии Java ... и проконсультируйтесь с адвокатом.)