добавление пути к классам в Linux

export CLASSPATH=.;../somejar.jar;../mysql-connector-java-5.1.6-bin.jar
java -Xmx500m folder.subfolder../dit1/some.xml
cd ..

верен ли приведенный выше оператор для установки пути к классам к уже существующему пути к классам в Linux

Ответов (5)

Важное различие между установкой пути к классам в Windows и Linux - это разделитель пути ";" (точка с запятой) в Windows и «:» (двоеточие) в Linux. Также %PATH% используется для представления значения существующей переменной пути в Windows, в то время ${PATH} как используется для той же цели в Linux (в оболочке bash). Вот способ настройки пути к классам в Linux:

export CLASSPATH=${CLASSPATH}:/new/path

но как таковой путь к классам очень сложен, и вы можете задаться вопросом, почему ваша программа не работает даже после установки правильного пути к классам. На заметку:

  1. -cpпараметры переопределяют CLASSPATHпеременную среды.
  2. Путь к классам, определенный в файле манифеста, переопределяет как переменную окружения, так -cpи CLASSPATHпеременную окружения.

Ссылка: Как Classpath работает в Java .

В linux пути разделяются : двоеточием ( ; ), а не точкой с запятой ( ), поскольку theatrus правильно использовал это в своем примере. Я считаю, что Java уважает это соглашение.

Редактировать

В качестве альтернативы тому, что предложил Энди , вы можете использовать следующую форму (которая устанавливает CLASSPATH на время выполнения команды):

CLASSPATH=".:../somejar.jar:../mysql-connector-java-5.1.6-bin.jar" java -Xmx500m ...

в зависимости от того, что вам удобнее.

Для пользователей Linux, и чтобы подвести итог и добавить к сказанному здесь другими, вы должны знать следующее:

  1. Глобальные переменные - не зло. $ CLASSPATH - это именно то, что Java использует для просмотра нескольких каталогов, чтобы найти все различные классы, необходимые для вашего скрипта (если вы явно не укажете иное с помощью -cp override).

  2. Двоеточие (":") разделяет разные каталоги. Есть только один $ CLASSPATH, и в нем есть все каталоги. Итак, когда вы запускаете «export CLASSPATH = ....», вы хотите включить текущее значение «$ CLASSPATH», чтобы добавить к нему. Например:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
    

    В первой строке выше вы запускаете CLASSPATH с простой «точки», которая является путем к вашему текущему рабочему каталогу. При этом всякий раз, когда вы запускаете java, он будет искать классы в текущем рабочем каталоге (том, в котором вы находитесь). Во второй строке выше $ CLASSPATH получает значение, которое вы ранее ввели (.), И добавляет путь к директории mysql. Теперь java будет искать драйвер И для ваших классов.

  3. echo $CLASSPATH
    

    очень удобно, и то, что он возвращает, должно читаться как список всех каталогов, разделенных двоеточиями, в которых Java ищет то, что нужно для запуска вашего скрипта.

  4. Tomcat не использует CLASSPATH. Прочтите, что с этим делать, здесь: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Всегда рекомендуется никогда не разрушать существующий путь к классам деструктивно, если у вас нет веской причины.

Следующая строка сохраняет существующий путь к классам и добавляет к нему.

export CLASSPATH="$CLASSPATH:foo.jar:../bar.jar"

Мне не нравится устанавливать 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 или пакетный сценарий, чтобы сэкономить на вводе.