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

Вам разрешено изменять argc и argv, но это не значит, что C внезапно обрабатывает (пере) распределение этих переменных для вас. argv будет массивом типа char* argv[argc];. Он будет содержать столько указателей, сколько argc говорит, что он содержит, не больше, не меньше. Точно так же длина каждой строки, на которую указывает argv[i], равна длине, которую передал вызывающий.

Пример:

myprog.exe foo 
  • Это означает, что argc == 2 и argv будут иметь длину 2. Это не может быть изменено вашей программой.
  • argv[0] будут указывать на модифицируемую строку "myprog.exe", размер 10 + 1 = 11 байтов. Вы можете изменить содержимое, но не хранить в нем ничего длиннее 11 байт.
  • argv[1] будет указывать на строку "foo", размер 3 + 1 = 4 байта. Вы можете изменить содержимое, но не хранить там ничего длиннее 4 байт.

(Любопытство: это совершенно нормально и, пожалуй, самый правильный способ определить argv как VLA следующим образом:
int main (int argc, char* argv[argc]), потому что argv распадается на char** в любом случае.)


То, что все сказанное, изменение argc и argv, хотя и допускается стандартом C, является ужасно плохой практикой. Не делай этого. Вместо этого вы должны использовать локальную переменную и позволить ей ссылаться на argv, где это необходимо. Пример:

int main (int argc, char* argv[])
{
  const char* argstr [12] = 
  {
    "str0",
    "str1",
    "str2",
    "str3",
    "str4",
    "str5",
    "str6",
    "str7",
    "str8",
    "str9",
    "str10",
    "str11",
  };

  for(int i=0; i<argc; i++)
  {
    argstr[i] = argv[i];
  }

  /* always use argstr here, never argv */

  return 0;
}
12
задан John Kugelman supports Monica 2 January 2018 в 00:40
поделиться

3 ответа

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

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

export CLASSPATH="$CLASSPATH:foo.jar:../bar.jar"
16
ответ дан 2 December 2019 в 02:59
поделиться

Мне не нравится установка CLASSPATH. ПУТЬ К КЛАССУ является глобальной переменной и как таковой, это является злым:

  • При изменении его в одном сценарии внезапно некоторые программы Java прекратят работать.
  • При помещении там библиотек для всех вещей, которые Вы выполняете, и это нарушено.
  • Вы получаете конфликты, если два различных приложения используют различные версии той же библиотеки.
  • Нет никакого увеличения производительности, поскольку библиотеки в ПУТИ К КЛАССУ не совместно используются - просто, их имя совместно используется.
  • Если Вы помещаете точку (.) или какой-либо другой относительный путь в ПУТИ К КЛАССУ, который означает другую вещь в каждом месте - который вызовет беспорядок, наверняка.

Поэтому предпочтительный путь состоит в том, чтобы установить путь к классу на каждое выполнение jvm, например:

java -Xmx500m -cp ".:../somejar.jar:../mysql-connector-java-5.1.6-bin.jar"    "folder.subfolder../dit1/some.xml

Если это становится длинным, стандартная процедура должна перенести его в удар или сценарий пакетной обработки для сохранения ввода.

25
ответ дан 2 December 2019 в 02:59
поделиться

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

Править

Кроме того, к тому, какой предложенный andy, можно использовать следующую форму (который устанавливает ПУТЬ К КЛАССУ на время команды):

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

какой бы ни более удобно для Вас.

6
ответ дан 2 December 2019 в 02:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: