2017-01-20 6 views
3

Мне нужно запустить java-задачу с очень большим количеством путей к классам (1000, всего 150 тыс. Символов, если они объединены).Сколько классов может быть указано в командной строке Java?

Проблема заключается в том, что Java возвращает ошибку, когда я пытаюсь выполнить этот класс:

/jdk/JAVA8/bin/java: Argument list too long 

Код ошибки 7

Я пытался поставить с помощью пути к классам "экспорта CLASSPATH = CLASSPATH: ..... "и поэтому я не должен указывать их через параметр -cp java, но он возвратил ту же ошибку.

Я уверен, что проблема вращается вокруг предела класса, потому что если я удалю часть пути к классу, ошибка исчезнет (но тогда у меня будут логические ошибки в выполнении, потому что мне нужны все пути к классам)

+0

Почему? Почему бы не запустить JAR-файл, который перечисляет их все в записи Manifest Class-path? – EJP

+0

Это будет класс, чтобы сделать некоторый анализ кода предварительной сборки, поэтому ему нужны все пути к классам, и он не обязательно должен быть банкой. Я мог бы создать банку, решила бы проблема? – rodi

ответ

1
  • Вы можете использовать classpath wildcards. Особенно, если многие из ваших файлов jars/class находятся в одном каталоге, это очень поможет.

  • Это может быть ограничение по размеру переменной окружения или ограничение по размеру командной строки, а не ограничение java-шаблона класса javac.

  • javac принимает аргументы из ввода файла. Вы можете добавить все свои аргументы в этот файл и передать аргумент этого файла команде. См. this для получения дополнительной информации.

+0

К сожалению, все они находятся в разных каталогах (используя встроенные системы, которые кэшируют библиотеки внутри), и нет необходимости использовать javac, так как мне просто нужно выполнить класс, который является частью задачи предварительной сборки. – rodi

1

Вы не попали в Java-специфические ограничения, но зависит от системы предела. Это лучше всего иллюстрируется тем фактом, что попытка установить переменную CLASSPATH также не удалась, но установка переменной окружения через export name=value в оболочке не связана с Java.

Как уже говорилось другими, вы можете попытаться использовать подстановочные знаки для файлов jar в том же каталоге, но вам нужно заботиться о том, чтобы Java выполняла расширение, а не оболочку, как в последнем случае, это снова дало бы слишком длинной командной строки. Таким образом, вам нужно избежать символа *, чтобы он не обрабатывался оболочкой.

javac поддерживает чтение аргументов командной строки из внешнего файла, указанного через @filename, но, к сожалению, пусковая установка java не поддерживает эту опцию.

Альтернативой было бы создание символических ссылок, указывающих на файлы jar, имеющих более короткие пути и определяющие их. Вы могли бы даже комбинировать подходы, создав один каталог, полный символических ссылок, и указав that/directory/* как путь к классу.

Но, как представляется, логическая ошибка в требовании. В комментарии вы упоминаете «анализ кода», и анализирующий инструмент не должен требовать анализа кода в своем собственном пути класса приложения. Вы можете получить доступ к файлам классов с помощью обычного ввода-вывода, если хотите прочитать и проанализировать их. Если вы хотите загрузить их, например. для использования встроенного Reflection вы можете создать новые экземпляры ClassLoader, указывающие на местоположения. Таким образом, инструмент не зависит от пути класса приложения и, например, может считывать данные из файла конфигурации.

Использование специальных погрузчиков классов имеет дополнительное преимущество, которое вы можете сделать close them, когда вы закончите.

1

JVM не ограничивает путь пути. Тем не менее, существует ограничение ОС на длину командной строки и размер переменных среды.

В Linux проверьте getconf ARG_MAX, чтобы увидеть предел.
В старых версиях ядра это только 128KB. На более новых ядрах он находится где-то около 2MB.

Если вы хотите установить очень длинные классы, вам может понадобиться трюк JAR-Manifest. См. this question.

Смежные вопросы