Что такое классный путь?
Я просто читал эту строку:
Первое, что делает метод format(), это загружает шаблон Velocity из пути к классу с именем output.vm
И я не мог понять, что подразумевается под classpath в этом контексте.
12 ответов
При программировании на 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
параметр.
Так каков лучший способ сделать это?
Задавать глобально через переменные окружения плохо, как правило, по тем же причинам, что и глобальные переменные. Вы изменяете переменную среды CLASSPATH, чтобы одна программа работала, и в итоге вы ломали другую программу.
-Cp - это путь. Обычно я проверяю, чтобы моя переменная среды CLASSPATH представляла собой пустую строку, где я разрабатываю, когда это возможно, чтобы избежать глобальных проблем с classpath (хотя некоторые инструменты недовольны, когда глобальный classpath пуст - я знаю две распространенные, мега-тысячи лицензированные J2EE и Java-серверы, имеющие такую проблему со своими инструментами командной строки).
Думайте об этом как о ответе Java на переменную среды PATH - операционные системы ищут EXE-файлы в PATH, Java ищет классы и пакеты в classpath.
Как и вопрос о Спрингстене.
Путь к классам - одна из фундаментальных концепций в мире Java, и ее часто неправильно понимают или вообще не понимают Java-программы, особенно новички.
Проще говоря, это просто
set of paths
где компилятор java и JVM должны найти необходимые классы для компиляции или выполнения других классов.
Начнем с примера, предположим, что у нас есть
Main.java
файл, который находится под
C:\Users\HP\Desktop\org\example
,
package org.example;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
А теперь предположим, что мы находимся в каталоге и хотим скомпилировать наш класс. Все просто, просто запустите:
javac .\Users\HP\Desktop\org\example\Main.java
Теперь что касается трудного вопроса, мы находимся в одной папке
C:\
и мы хотим запустить скомпилированный класс.
Несмотря на то, что вы могли бы подумать, правильный ответ:
java -cp .\Users\HP\Desktop org.example.Main
Я объясню, почему, прежде всего, имя класса, который нам нужен ro tun, это
org.exmaple.Main
не Main , или Main.class или . \ users \ hp \ desktop \ org \ example \ Main.class ! Вот как все работает с классами, объявленными в пакетах.
Теперь мы предоставили имя класса JVM (в данном случае команда java), но как она (JVM) узнает, где найти файл .class для основного класса? Вот где
classpath
входит в картину. С использованием
-cp
flag (ярлык для -classpath), мы сообщаем JVM, что наш файл Main.class будет расположен в
C:\users\hp\Desktop
.. На самом деле не совсем, мы говорим это
just go to the Desktop directory, and, because of the name of the class org.example.Main, the JVM is smart and it will go from Desktop to org directory, and from org to example directory, searching for Main.class file
, и он его найдет, и он его убьет, я имею в виду, он запустит его: D.
Теперь предположим, что внутри основного класса мы хотим работать с другим классом с именем
org.apache.commons.lang3.StringUtils
а последний находится в файле jar с именем
commons-lang3-3.10.jar
это внутри
C:\Users\HP\Downloads
. Итак, Main.java теперь будет выглядеть так:
package org.example;
import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
System.out.println(StringUtils.equals("java", "java")); //true
}
}
Как скомпилировать Main.java, если мы всегда находимся внутри C:\? Ответ:
javac -cp .\Users\HP\Downloads\commons-lang3-3.10.jar .\Users\HP\Desktop\org\example\Main.java
.\Users\HP\Desktop\org\example\Main.java
потому что наш файл .java находится в файловой системе.-cp .\Users\HP\Downloads\commons-lang3-3.10.jar
потому что компилятору java (в данном случае javac int) необходимо знать расположение класса org.apache.commons.lang3.StringUtils , поэтому мы указали путь к файлу jar, а затем компилятор перейдет внутрь файла jar и попробуйте найти файл StringUtils.class внутри каталогаorg\apache\commons\lang3
.
И если мы хотим запустить файл Main.class, мы выполним:
java -cp ".\Users\HP\Desktop\;.\Users\HP\Downloads\commons-lang3-3.10.jar" org.example.Main
org.example.Main
это имя класса.".\Users\HP\Desktop\;.\Users\HP\Downloads\commons-lang3-3.10.jar"
- это пути (разделенные; в Windows) к классам Main и StringUtils.
Путь к классам - это путь, по которому виртуальная машина 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 и среде выполнения для определения местоположения пакетов 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
Classpath - это переменная окружения системы. Настройка этой переменной используется для предоставления корня любой иерархии пакетов для компилятора Java.
Для пользователей Linux, и чтобы подвести итог и добавить к сказанному здесь другими, вы должны знать следующее:
$CLASSPATH - это то, что Java использует для просмотра нескольких каталогов, чтобы найти все различные классы, необходимые для вашего скрипта (если вы явно не укажете иное с помощью -cp override). Использование -cp требует, чтобы вы отслеживали все каталоги вручную и копировали и вставляли эту строку каждый раз, когда вы запускаете программу (не предпочтительно IMO).
Двоеточие (":") разделяет разные каталоги. Есть только один $CLASSPATH, и в нем есть все каталоги. Итак, когда вы запускаете "export CLASSPATH=....", вы хотите включить текущее значение "$CLASSPATH", чтобы добавить к нему. Например:
export CLASSPATH=. export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
В первой строке выше вы запускаете CLASSPATH с простой точки, которая является путем к вашему текущему рабочему каталогу. При этом всякий раз, когда вы запускаете java, он будет искать классы в текущем рабочем каталоге (том, в котором вы находитесь). Во второй строке выше $CLASSPATH получает значение, которое вы ранее ввели (.), И добавляет путь к директории mysql. Теперь java будет искать драйвер И для ваших классов.
echo $CLASSPATH
очень удобен, и то, что он возвращает, должно читаться как список всех каталогов и файлов.jar, разделенных двоеточиями, вы хотите, чтобы java искала нужные классы.
Tomcat не использует CLASSPATH. Прочтите, что с этим делать, здесь: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
Статический член класса может быть вызван напрямую, без создания экземпляра объекта. Поскольку основным методом является статическая виртуальная машина Java, она может вызывать ее без создания какого-либо экземпляра класса, который содержит основной метод, который является начальной точкой программы.
Environment variable
является глобальной системной переменной, доступной всем процессам, работающим в операционной системе (ОС).
classpath
в Java это environment variable
используется виртуальной машиной Java для поиска или поиска файлов классов (.class
) в Java во время загрузки класса ClassLoader
,
Компилятор Java (javac
) Java Runtime (java
) и другие инструменты Java ищут классы, используемые в вашей программе, в следующем порядке:
- Классы платформы Java (начальной загрузки)
- Каталоги расширений Java
Путь поиска классов пользователя (короче говоря,
classpath
): определяется в следующем порядке:а. По умолчанию на
current working directory (.)
,б. Записи в
classpath
environment variable
, который переопределяет значение по умолчанию.с. Записи в
-cp
(или же-classpath
) параметр командной строки, который переопределяетclasspath
переменная окружения.д. Параметр командной строки во время выполнения
-jar
, которые отменяют все вышеперечисленное.
classpath
Переменная окружения может включать каталоги (содержащие много файлов классов) и файлы JAR (однофайловый архив файлов классов). Если classpath
не установлено, по умолчанию current directory
, Если вы установите classpath
важно включить current working directory (.)
, В противном случае текущий каталог не будет найден.
Вы можете переопределить classpath
в Java, определяется environment variable
предоставляя опцию -cp
или же -classpath
во время работы Java-программы, и это лучший способ иметь разные classpath
для разных приложений Java, работающих на одном компьютере с Unix или Windows.
java -cp "<path/1><separator><path/2>" <path.to.your.MainClass>
разделители точка с запятой ;
- окна, двоеточие :
- Linux
Например, команда для MacOS
java -cp "Test.jar:lib/*" my.package.MainClass
classpath и path являются переменными среды. обычно вам нужно указать путь к файлу jdk/bin, чтобы вы могли везде использовать java-компилятор, classpath - это путь к вашим файлам.class. путь к классу имеет путь по умолчанию точка (.), что означает текущий каталог. но когда ты использовал пакеты. Вы либо указали бы полный путь к файлу.class, либо поместили бы путь к файлу.class в classpath, что спасло бы много работ!