Переменные пути являются концепцией во всех операционных системах Unix и Windows. Они не являются изобретением Java, но Java основывает на них свои собственные пути к классам и путям модулей.
Значение переменной пути - это просто строка, содержащая список местоположений файлов, разделенных двоеточием (:
) в Unix или точкой с запятой (;
) в Windows.
Самая распространенная переменная пути это просто PATH
. (Я полагаю, что в Windows каноническое имя переменной - Path
, но переменные среды не чувствительны к регистру в Windows, поэтому в большинстве случаев ее можно назвать PATH
.)
Когда вы пытаетесь выполнить программу в командной строке, указав имя команды без компонентов каталога, операционная система проверяет каждое расположение файла в PATH
по порядку и для каждого расположения, которое является каталогом, Система будет искать совпадение там. Первое совпадение - это то, что используется операционной системой.
Java заимствует эту концепцию для пути к классам. В первые дни Java это было точно так же: если ваш classpath был /home/giulio:/opt/libraries
, и вы искали класс с именем com.example.ConnectionFactory
, Java искала бы скомпилированный файл с именем com/example/ConnectionFactory.class
в / home / giulio а затем в /opt/libraries.
Вскоре пути к классам было разрешено содержать файлы, которые являются сжатыми архивами классов, в дополнение к каталогам. Ваш путь к классу может содержать /home/giulio:/opt/libraries/foolib.jar
, и в этом случае Java сначала проверит наличие запрошенного класса в / home / giulio, поскольку это каталог, а если это не удастся, то будет искать соответствующую запись в / opt / library / Архивный файл foolib.jar. (Zip-файлы также приемлемы, и на самом деле .jar-файл на самом деле представляет собой просто zip-файл с несколькими специальными записями, специфичными для Java.)
Итак, если вы хотите указать Java, чтобы в определенных местах искать библиотеки, укажите их в classpath.
Например, при компиляции кода клиента:
projectroot=`dirname "$0"`
javac -classpath "$projectroot"/sharedClasses/classes \
-d "$projectroot"/client/classes \
"$projectroot"/client/src/*.java
Когда вы запускаете код:
java -classpath "$projectroot"/sharedClasses/classes:"$projectroot"/client/classes \
edu.acme.giulio.client.Main