Задача выдает ошибку=7: список аргументов слишком длинный
У меня есть файл Ant build.xml, который выполняется без проблем на моей машине (Ubuntu), но выдает следующую ошибку:
/var/lib/hudson/workspace/myproject/build.xml:254: Error running /var/lib/hudson/tools/java_6/bin/javac compiler
at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:525)
(...)
Caused by: java.io.IOException: Cannot run program "/var/lib/hudson/tools/java_6/bin/javac": java.io.IOException: error=7, Argument list too long
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
at java.lang.Runtime.exec(Runtime.java:593)
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:862)
at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:481)
at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:495)
at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:522)
... 19 more
Caused by: java.io.IOException: java.io.IOException: error=7, Argument list too long
at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
... 24 more
Список аргументов довольно большой, на самом деле содержит все файлы jar из WEB-INF/lib, длина которых составляет 231650 символов!
Есть предложения, как это исправить?
3 ответов:
Использование
applyдля вашегоfilesetв вашемbuild.xml, например<?xml version="1.0" encoding="UTF-8"?> <project default="build"> <fileset id="myfiles" dir="${basedir}"> <include name="**/*.java"/> <exclude name="**/Resources/**"/> <modified> <param name="cache.cachefile" value="${basedir}/cache.${project}.fileset.myfiles.properties"/> </modified> </fileset> <target name="execute-some-command"> <apply executable="javac" dir="${basedir}" failonerror="true"> <fileset refid="myfiles"/> </apply> </target> </project>По умолчанию команда будет выполняться один раз для каждого файла.
Если вам нужно использовать
parallelдля выполнения команды только один раз, то используйтеmaxparallel, чтобы ограничить количество параллелизма, передавая не более этого количества исходных файлов одновременно (например, установите значение1000для передачи тысячи файлов за один запуск). Например:<apply executable="javac" parallel="true" maxparallel="1000" dir="${basedir}"> <fileset refid="myfiles"/> </apply>Чтобы узнать, сколько всего файлов у вас есть, проверьте содержимое файла кэша (ищите
cache.cachefileв приведенном выше примере).
С такой длинной командой вы, скорее всего, запускаете ARG_MAX в оболочке.
Это даст хорошую оценку доступной длины.,
exprgetconf ARG_MAX-env|wc -c-env|wc -l* 4 - 2048Хорошую статью о списках команд arg и длине можно найти здесь
Выполнить
ant -d. Это позволит производить объемные объемы продукции. Однако он также покажет всю строку компиляции, которая может помочь вам понять, почему она так длинна.Вы используете Jenkins / Hudson, и именно там возникает ошибка?
Попробуйте следующее:
- отключить сборку.
- войдите в свой сервер сборки, как пользователь JENKINS и найдите каталог
workdir, в котором Jenkins/Hudson пытается выполнить сборку.- Возможно, вам придется изменить
$PATHили установите$JAVA_HOME, чтобы указать на JDK, который использует Хадсон/Дженкинс.- а теперь беги.
ant -d<target>так же, как и Дженкинс / Хадсон. Передайте этот вывод черезteeв файл. Теперь взгляните и посмотрите, что делает Хадсон / Дженкинс и почему уjavacслишком много аргументов.
Comments