Что такое classpath и как мне его установить?


325

Я просто читал эту строку:

Первое, что делает метод format (), это загружает шаблон Velocity из пути к классу с именем output.vm

Пожалуйста, объясните, что подразумевалось под classpath в этом контексте, и как я должен установить classpath.

Ответы:


531

При программировании на Java вы делаете другие классы доступными для написанного вами класса, помещая что-то вроде этого в верхней части исходного файла:

import org.javaguy.coolframework.MyClass;

Или иногда вы «массово импортируете» вещи, говоря:

import org.javaguy.coolframework.*;

Итак, позже в вашей программе, когда вы говорите:

MyClass mine = new MyClass();

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

Было бы нецелесообразно, чтобы виртуальная машина просматривала каждую папку на вашем компьютере, поэтому вы должны предоставить виртуальной машине список мест для поиска. Это делается путем помещения папок и файлов JAR в ваш путь к классам.

Прежде чем говорить о том, как установлен classpath, давайте поговорим о файлах .class, пакетах и ​​.jar.

Во-первых, давайте предположим, что MyClass - это то, что вы создали как часть вашего проекта, и оно находится в каталоге вашего проекта с именем output. Файл .class будет в output/org/javaguy/coolframework/MyClass.class(вместе со всеми другими файлами в этом пакете). Чтобы добраться до этого файла, ваш путь должен просто содержать папку «output», а не всю структуру пакета, поскольку ваш оператор import предоставляет всю эту информацию для виртуальной машины.

Теперь давайте предположим, что вы упаковали CoolFramework в файл .jar и поместили этот CoolFramework.jar в каталог lib вашего проекта. Теперь вам нужно поместить lib/CoolFramework.jarв ваш путь к классам. ВМ поищет внутри файл jar org/javaguy/coolframeworkи найдет ваш класс.

Итак, классовые пути содержат:

  • JAR-файлы и
  • Пути к вершине иерархии пакетов.

Как вы устанавливаете свой classpath?

Первый способ, которым все, кажется, учатся, с переменными среды. На Unix-машине вы можете сказать что-то вроде:

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

На компьютере с Windows вам нужно перейти к настройкам вашей среды и либо добавить, либо изменить уже существующее значение.

Второй способ - использовать -cpпараметр при запуске Java, например так:

java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

Вариант этого - третий способ, который часто выполняется с помощью файла .shили, .batкоторый вычисляет путь к классу и передает его в Java через -cpпараметр.

Есть "гоча" со всем вышеперечисленным. В большинстве систем (Linux, Mac OS, UNIX и т. Д.) Символ двоеточия (':') является разделителем пути к классам. В WindowsM разделитель - точка с запятой (';')

Так каков лучший способ сделать это?

Задавать глобально через переменные окружения плохо, как правило, по тем же причинам, что и глобальные переменные плохо. Вы изменяете переменную среды CLASSPATH, чтобы одна программа работала, и в итоге вы ломали другую программу.

-Cp это путь. Обычно я проверяю, чтобы моя переменная среды CLASSPATH представляла собой пустую строку, в которой я разрабатываю, когда это возможно, чтобы избежать глобальных проблем с classpath (хотя некоторые инструменты недовольны, когда глобальный classpath пуст - я знаю две общие, мега-тысячи лицензированные J2EE и Java-серверы, имеющие такую ​​проблему с инструментами командной строки).


12
Другой хорошо объясненный блог о том, что такое PATH и CLASSPATH в Java - путь против ClassPath
KNU

В python есть папка с именем Lib, в которой вы можете хранить любой модуль для использования в любое время с помощью простого оператора импорта. Это отличается от установки переменной среды CLASSPATH в каталог для сторонних пакетов Java? Даже если он будет глобальным, не нужно будет изменять переменную, кроме добавления дополнительных пакетов.
Джози Томпсон

Хороший ответ, но для манекенов здесь: почему вам не нужно использовать команду -cp для каждого нового класса, который вы создаете? Это, безусловно, решается автоматически вашей системой, верно? Но как? Иногда я сталкиваюсь с проблемой, когда «что-то» не может быть найдено в моем пути к классам - я полагаю, это так, потому что я не добавил его в cp, но почему такая ошибка возникает только иногда, а не всегда? Я спрашиваю об этом, потому что, если честно, я никогда ничего не включал вручную с помощью команды -cp и не знал, что делать с такой ошибкой
Vic Torious

2
@Vic Путь к классу должен содержать каталог над иерархией каталогов, соответствующий имени пакета. Так что, если у меня есть org.javaguy.coolfw, с соответствующей структурой каталогов /path/to/org/javaguy/coolfw/, classpath должен будет содержать /path/to/. Если я добавлю новый пакет org.javaguy.hotfwв тот же проект, результирующий класс (обычно) заканчивается на /path/to/org/javaguy/hotfw/. Это требует, чтобы classpath содержал /path/to/, который это уже делает. Таким образом, новый пакет (и содержащиеся в нем классы) не требуют новых дополнений к пути к классам.
17

@Vic Для более конкретного примера и объяснения см. Освоение Java CLASSPATH (за отличный комментарий KNU )
17

67

Думайте об этом как о ответе Java на переменную среды PATH - операционные системы ищут EXE-файлы в переменной PATH, Java ищет классы и пакеты в пути к классам.


13

Путь к классам - это путь, по которому виртуальная машина Java ищет пользовательские классы, пакеты и ресурсы в программах Java.

В этом контексте format()метод загружает файл шаблона по этому пути.


5

Путь к классам в этом контексте является именно тем, что и в общем контексте: везде, где виртуальная машина знает, что она может найти классы для загрузки, а также ресурсы (например, output.vm в вашем случае).

Я понимаю, что Velocity ожидает найти файл с именем output.vm в любом месте «без пакета». Это может быть JAR, обычная папка, ... Корень любого расположения в пути к классам приложения.


2

Установка системной переменной CLASSPATH

Чтобы отобразить текущую переменную CLASSPATH, используйте эти команды в Windows и UNIX (оболочка Bourne): В Windows: C:\> set CLASSPATH В UNIX: % echo $CLASSPATH

Чтобы удалить текущее содержимое переменной CLASSPATH, используйте следующие команды: В Windows: C:\> set CLASSPATH= В UNIX: % unset CLASSPATH; export CLASSPATH

Чтобы установить переменную CLASSPATH, используйте эти команды (например): В Windows: C:\> set CLASSPATH=C:\users\george\java\classes В UNIX: % CLASSPATH=/home/george/java/classes; export CLASSPATH


1
Хотя эти команды могут быть полезны для работы с переменными среды, это не отвечает на вопрос
Халк

1

Classpath - это переменная окружения системы. Параметр этой переменной используется для предоставления корня любой иерархии пакетов для компилятора Java.


1

CLASSPATH - это переменная среды (т. Е. Глобальные переменные операционной системы, доступные для всех процессов), необходимые компилятору Java и среде выполнения для определения местоположения пакетов Java, используемых в программе Java. (Почему бы не вызвать PACKAGEPATH?) Это похоже на другую переменную среды PATH, которая используется оболочкой CMD для поиска исполняемых программ.

CLASSPATH может быть установлен одним из следующих способов:

CLASSPATH can be set permanently in the environment: In Windows, choose control panel  System  Advanced  Environment Variables  choose "System Variables" (for all the users) or "User Variables" (only the currently login user)  choose "Edit" (if CLASSPATH already exists) or "New"  Enter "CLASSPATH" as the variable name  Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.

To check the current setting of the CLASSPATH, issue the following command:

> SET CLASSPATH

CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:

> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar

Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,

> java classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3

0

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


0

Для пользователей Linux, а также для подведения итогов и дополнения к тому, что здесь сказали другие, вы должны знать следующее:

  1. $ CLASSPATH - это то, что Java использует для просмотра нескольких каталогов, чтобы найти все различные классы, необходимые для вашего сценария (если вы явно не укажете это с помощью переопределения -cp). Использование -cp требует, чтобы вы отслеживали все каталоги вручную и копировали и вставляли эту строку при каждом запуске программы (не предпочтительно IMO).

  2. Символ двоеточия (":") разделяет разные каталоги. Существует только один $ CLASSPATH, и в нем есть все каталоги. Итак, когда вы запускаете «export CLASSPATH = ....», вы хотите включить текущее значение «$ CLASSPATH» для добавления к нему. Например:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar

    В первой строке выше вы начинаете CLASSPATH с простой «точки», которая является путем к вашему текущему рабочему каталогу. При этом всякий раз, когда вы запускаете java, он будет искать классы в текущем рабочем каталоге (в котором вы находитесь). Во второй строке выше, $ CLASSPATH получает значение, которое вы ранее ввели (.), И добавляет путь к dirver mysql. Теперь Java будет искать драйвер и ваши классы.

  3. echo $CLASSPATH

    это очень удобно, и то, что он возвращает, должно читаться как разделенный двоеточиями список всех каталогов и файлов .jar, вы хотите, чтобы java искал те классы, которые ему нужны.

  4. Tomcat не использует CLASSPATH. Прочтите, что с этим делать, здесь: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.