Поиск…


Вступление

Путь к классам перечисляет места, где среда выполнения Java должна искать классы и ресурсы. Путь классов также используется компилятором Java для поиска ранее скомпилированных и внешних зависимостей.

замечания

Загрузка класса Java

JVM (виртуальная машина Java) будет загружать классы как и когда требуются классы (это называется ленивой загрузкой). Местоположения классов, которые будут использоваться, указаны в трех местах:

  1. Сначала загружаются те, которые требуются платформой Java, например, в библиотеке классов Java и ее зависимостях.
  2. Далее загружаются классы расширения (т. jre/lib/ext/ Те, что указаны в jre/lib/ext/ )
  3. Затем загружаются пользовательские классы через путь к классам

Классы загружаются с использованием классов, которые являются подтипами java.lang.ClassLoader . Это описано более подробно в этой теме: Classloaders .

Classpath

Путь к классам - это параметр, используемый JVM или компилятором, который определяет расположение пользовательских классов и пакетов. Это можно установить в командной строке, как в большинстве этих примеров, или через переменную окружения ( CLASSPATH )

Различные способы указания пути к классам

Существует три способа установки пути к классам.

  1. Его можно установить с помощью переменной среды CLASSPATH :

     set CLASSPATH=...         # Windows and csh
     export CLASSPATH=...      # Unix ksh/bash
    
  2. Его можно установить в командной строке следующим образом

     java -classpath ...
     javac -classpath ...
    

    Обратите внимание, что параметр -classpath (или -cp ) имеет приоритет над переменной среды CLASSPATH .

  3. Путь классов для исполняемого файла 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 или текущего каталога в противном случае.

Связанные с:

Добавление всех JAR в каталог к ​​пути к классам

Если вы хотите добавить все JAR-файлы в каталог в путь к классам, вы можете сделать это в сжатом виде с помощью синтаксиса подстановочных знаков класса; например:

 someFolder/*

Это сообщает JVM добавлять все JAR и ZIP-файлы в каталог someFolder в someFolder к классам. Этот синтаксис может быть использован в -cp аргумента, в CLASSPATH переменной окружения, или Class-Path атрибут в явном file.See виде исполняемого JAR - файла Настройка пути к классам: Путь класса Wild Cards для примеров и предостережений.

Заметки:

  1. Классовые маски классов были впервые введены в Java 6. Ранние версии Java не рассматривают «*» как подстановочный знак.
  2. Вы не можете вводить другие символы до или после « »; например, «someFolder / .jar» не является подстановочным знаком.
  3. Подстановочный знак соответствует только файлам с суффиксом «.jar» или «.JAR». Файлы ZIP игнорируются, как и файлы JAR с разными суффиксами.
  4. Подстановочный знак соответствует только JAR-файлам в самом каталоге, а не в его подкаталогах.
  5. Когда группа файлов 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-файл. В каждом случае местоположение является корнем пространства имен, которое будет искать.

Стандартная процедура поиска класса в пути к классам выглядит следующим образом:

  1. Сопоставьте имя класса с относительным именем класса RP . Отображение имен классов для имен файлов классов описано в другом месте.

  2. Для каждой записи 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 ... и проконсультируйтесь с адвокатом.)



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow