Ответы:
При программировании на 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
и найдет ваш класс.
Итак, классовые пути содержат:
Как вы устанавливаете свой 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/
, который это уже делает. Таким образом, новый пакет (и содержащиеся в нем классы) не требуют новых дополнений к пути к классам.
Путь к классам в этом контексте является именно тем, что и в общем контексте: везде, где виртуальная машина знает, что она может найти классы для загрузки, а также ресурсы (например, 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 может быть установлен одним из следующих способов:
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
Статический член класса может быть вызван напрямую, без создания экземпляра объекта. Поскольку основным методом является статическая виртуальная машина Java, она может вызывать ее без создания какого-либо экземпляра класса, который содержит основной метод, который является начальной точкой программы.
Для пользователей Linux, а также для подведения итогов и дополнения к тому, что здесь сказали другие, вы должны знать следующее:
$ CLASSPATH - это то, что Java использует для просмотра нескольких каталогов, чтобы найти все различные классы, необходимые для вашего сценария (если вы явно не укажете это с помощью переопределения -cp). Использование -cp требует, чтобы вы отслеживали все каталоги вручную и копировали и вставляли эту строку при каждом запуске программы (не предпочтительно IMO).
Символ двоеточия (":") разделяет разные каталоги. Существует только один $ 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 будет искать драйвер и ваши классы.
echo $CLASSPATH
это очень удобно, и то, что он возвращает, должно читаться как разделенный двоеточиями список всех каталогов и файлов .jar, вы хотите, чтобы java искал те классы, которые ему нужны.
Tomcat не использует CLASSPATH. Прочтите, что с этим делать, здесь: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html.