Ответов (5)5
Важное различие между установкой пути к классам в Windows и Linux - это разделитель пути ";" (точка с запятой) в Windows и «:» (двоеточие) в Linux. Также %PATH%
используется для представления значения существующей переменной пути в Windows, в то время ${PATH}
как используется для той же цели в Linux (в оболочке bash). Вот способ настройки пути к классам в Linux:
export CLASSPATH=${CLASSPATH}:/new/path
но как таковой путь к классам очень сложен, и вы можете задаться вопросом, почему ваша программа не работает даже после установки правильного пути к классам. На заметку:
-cp
параметры переопределяютCLASSPATH
переменную среды.- Путь к классам, определенный в файле манифеста, переопределяет как переменную окружения, так
-cp
иCLASSPATH
переменную окружения.
Ссылка: Как Classpath работает в Java .
В linux пути разделяются :
двоеточием ( ;
), а не точкой с запятой ( ), поскольку theatrus правильно использовал это в своем примере. Я считаю, что Java уважает это соглашение.
Редактировать
В качестве альтернативы тому, что предложил Энди , вы можете использовать следующую форму (которая устанавливает CLASSPATH на время выполнения команды):
CLASSPATH=".:../somejar.jar:../mysql-connector-java-5.1.6-bin.jar" java -Xmx500m ...
в зависимости от того, что вам удобнее.
Для пользователей Linux, и чтобы подвести итог и добавить к сказанному здесь другими, вы должны знать следующее:
Глобальные переменные - не зло. $ CLASSPATH - это именно то, что Java использует для просмотра нескольких каталогов, чтобы найти все различные классы, необходимые для вашего скрипта (если вы явно не укажете иное с помощью -cp override).
Двоеточие (":") разделяет разные каталоги. Есть только один $ 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
очень удобно, и то, что он возвращает, должно читаться как список всех каталогов, разделенных двоеточиями, в которых Java ищет то, что нужно для запуска вашего скрипта.
Tomcat не использует CLASSPATH. Прочтите, что с этим делать, здесь: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
Мне не нравится устанавливать CLASSPATH. CLASSPATH - это глобальная переменная, и как таковая она зла:
- Если вы измените его в одном скрипте, вдруг некоторые java-программы перестанут работать.
- Если вы поместите туда библиотеки для всех вещей, которые вы запускаете, он станет беспорядочным.
- Конфликты возникают, если два разных приложения используют разные версии одной и той же библиотеки.
- Прирост производительности отсутствует, поскольку библиотеки в CLASSPATH не являются общими - используется только их имя.
- Если вы поместите точку (.) Или любой другой относительный путь в CLASSPATH, это будет означать разные вещи в каждом месте - это наверняка вызовет путаницу.
Поэтому предпочтительным способом является установка пути к классам для каждого запуска jvm, например:
java -Xmx500m -cp ".:../somejar.jar:../mysql-connector-java-5.1.6-bin.jar" "folder.subfolder../dit1/some.xml
Если он становится длинным, стандартная процедура заключается в том, чтобы обернуть его в bash или пакетный сценарий, чтобы сэкономить на вводе.