Задача выдает ошибку=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 символов!
Есть предложения, как это исправить?

576   3  

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 в оболочке.

Это даст хорошую оценку доступной длины., expr getconf 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

    Ничего не найдено.