Что такое classpath и как мне его установить?
Я только что читал эту строку:
Первое, что делает метод format(), это загружает шаблон Velocity из пути к классу с именем output.vm
Пожалуйста, объясните, что подразумевалось под classpath в данном контексте и как я должен задать classpath.
Переведено автоматически
Ответ 1
При программировании на Java вы делаете другие классы доступными для класса, который вы пишете, помещая что-то вроде этого в начало вашего исходного файла:
import org.javaguy.coolframework.MyClass;
Или иногда вы "массово импортируете" материал, говоря:
import org.javaguy.coolframework.*;
Итак, позже в вашей программе, когда вы говорите:
MyClass mine = new MyClass();
Виртуальная машина Java будет знать, где найти ваш скомпилированный класс.
Было бы непрактично, чтобы виртуальная машина просматривала каждую папку на вашем компьютере, поэтому вы должны предоставить виртуальной машине список мест для поиска. Это делается путем размещения папок и jar-файлов в вашем classpath.
Прежде чем мы поговорим о том, как задается classpath, давайте поговорим о файлах .class , пакетах и файлах .jar.
Во-первых, давайте предположим, что MyClass - это то, что вы создали как часть своего проекта, и оно находится в каталоге вашего проекта под названием output
. Файл .class будет находиться по адресу output/org/javaguy/coolframework/MyClass.class
(вместе с любым другим файлом в этом пакете). Чтобы получить доступ к этому файлу, ваш path просто должен содержать папку 'output', а не всю структуру пакета, поскольку ваша инструкция import предоставляет всю эту информацию виртуальной машине.
Теперь давайте предположим, что вы собрали CoolFramework в файл .jar и поместили его CoolFramework.jar в каталог lib в вашем проекте. Теперь вам нужно будет ввести lib/CoolFramework.jar
в свой classpath. Виртуальная машина поищет в файле 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
or .bat
, который вычисляет classpath и передает его в Java через -cp
параметр.
Со всем вышеперечисленным есть "ошибка". В большинстве систем (Linux, Mac OS, UNIX и т.д.) Символ двоеточия (:
) является разделителем classpath. В Windows разделителем является точка с запятой (;
)
Итак, как лучше всего это сделать?
Глобальная настройка с помощью переменных окружения - это плохо, как правило, по тем же причинам, что и глобальные переменные. Вы изменяете CLASSPATH
переменную окружения, чтобы одна программа работала, и в конечном итоге вы нарушаете работу другой программы.
-cp
Это правильный путь. Обычно я слежу за тем, чтобы моя CLASSPATH
переменная окружения была пустой строкой, в которой я разрабатываю, когда это возможно, чтобы избежать проблем с глобальным путем к классам (хотя некоторые инструменты недовольны, когда глобальный путь к классам пуст - я знаю два распространенных сервера J2EE и Java с лицензией в мегатысячу долларов, у которых возникают такого рода проблемы с их инструментами командной строки).
Ответ 2
Думайте об этом как об ответе Java на переменную среды PATH - операционные системы ищут EXES в PATH, Java ищет классы и пакеты в classpath.
Ответ 3
Путь к классам является одним из фундаментальных понятий в мире Java, и его часто неправильно понимают или не понимают вообще программы Java, особенно новички.
Проще говоря, classpath
это просто 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");
}
}
А теперь предположим, что мы находимся в C:\
каталоге и хотим скомпилировать наш класс, это просто, просто запустите:
javac .\Users\HP\Desktop\org\example\Main.java
Теперь к сложному вопросу: мы находимся в одной папке C:\
и мы хотим запустить скомпилированный класс.
Несмотря на то, что вы могли бы считать ответом, правильным является:
java -cp .\Users\HP\Desktop org.example.Main
Я объясню, почему, во-первых, имя класса, который мы хотим использовать, org.exmaple.Main
не Main, или Main.class или .\users\hp\desktop\org\example\Main.class ! Вот как все работает с классами, объявленными в разделе packages .
Теперь мы предоставили имя класса 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) необходимо знать расположение класса 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.
Ответ 4
classpath - это путь, по которому виртуальная машина Java ищет определенные пользователем классы, пакеты и ресурсы в программах Java.
В этом контексте метод format()
загружает файл шаблона по этому пути.