При программировании на 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-серверы, имеющие такую проблему с инструментами командной строки).
org.javaguy.coolfw
, с соответствующей структурой каталогов/path/to/org/javaguy/coolfw/
, classpath должен будет содержать/path/to/
. Если я добавлю новый пакетorg.javaguy.hotfw
в тот же проект, результирующий класс (обычно) заканчивается на/path/to/org/javaguy/hotfw/
. Это требует, чтобы classpath содержал/path/to/
, который это уже делает. Таким образом, новый пакет (и содержащиеся в нем классы) не требуют новых дополнений к пути к классам.Думайте об этом как о ответе Java на переменную среды PATH - операционные системы ищут EXE-файлы в переменной PATH, Java ищет классы и пакеты в пути к классам.
источник
Путь к классам - это путь, по которому виртуальная машина Java ищет пользовательские классы, пакеты и ресурсы в программах Java.
В этом контексте
format()
метод загружает файл шаблона по этому пути.источник
Путь к классам в этом контексте является именно тем, что и в общем контексте: везде, где виртуальная машина знает, что она может найти классы для загрузки, а также ресурсы (например, output.vm в вашем случае).
Я понимаю, что Velocity ожидает найти файл с именем output.vm в любом месте «без пакета». Это может быть JAR, обычная папка, ... Корень любого расположения в пути к классам приложения.
источник
Установка системной переменной 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
источник
Classpath - это переменная окружения системы. Параметр этой переменной используется для предоставления корня любой иерархии пакетов для компилятора Java.
источник
CLASSPATH - это переменная среды (т. Е. Глобальные переменные операционной системы, доступные для всех процессов), необходимые компилятору Java и среде выполнения для определения местоположения пакетов Java, используемых в программе Java. (Почему бы не вызвать PACKAGEPATH?) Это похоже на другую переменную среды PATH, которая используется оболочкой CMD для поиска исполняемых программ.
CLASSPATH может быть установлен одним из следующих способов:
источник
Статический член класса может быть вызван напрямую, без создания экземпляра объекта. Поскольку основным методом является статическая виртуальная машина Java, она может вызывать ее без создания какого-либо экземпляра класса, который содержит основной метод, который является начальной точкой программы.
источник
Для пользователей Linux, а также для подведения итогов и дополнения к тому, что здесь сказали другие, вы должны знать следующее:
$ CLASSPATH - это то, что Java использует для просмотра нескольких каталогов, чтобы найти все различные классы, необходимые для вашего сценария (если вы явно не укажете это с помощью переопределения -cp). Использование -cp требует, чтобы вы отслеживали все каталоги вручную и копировали и вставляли эту строку при каждом запуске программы (не предпочтительно IMO).
Символ двоеточия (":") разделяет разные каталоги. Существует только один $ CLASSPATH, и в нем есть все каталоги. Итак, когда вы запускаете «export CLASSPATH = ....», вы хотите включить текущее значение «$ CLASSPATH» для добавления к нему. Например:
В первой строке выше вы начинаете CLASSPATH с простой «точки», которая является путем к вашему текущему рабочему каталогу. При этом всякий раз, когда вы запускаете java, он будет искать классы в текущем рабочем каталоге (в котором вы находитесь). Во второй строке выше, $ CLASSPATH получает значение, которое вы ранее ввели (.), И добавляет путь к dirver mysql. Теперь Java будет искать драйвер и ваши классы.
это очень удобно, и то, что он возвращает, должно читаться как разделенный двоеточиями список всех каталогов и файлов .jar, вы хотите, чтобы java искал те классы, которые ему нужны.
Tomcat не использует CLASSPATH. Прочтите, что с этим делать, здесь: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html.
источник