任务抛出错误= 7:参数列表太长

时间:2011-04-05 09:08:38

标签: shell ant

我有一个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

参数列表非常大,实际上包含来自WEB-INF/lib的所有jar文件,长度为231650个字符! 有任何建议如何修复它?

3 个答案:

答案 0 :(得分:1)

使用很长的命令,您可能会在shell中运行到ARG_MAX。

这将报告可用长度的良好估计, expr getconf ARG_MAX - env|wc -c - env|wc -l * 4 - 2048

A nice article about command arg lists and length can be found here

答案 1 :(得分:1)

运行ant -d。这将产生大量的输出。但是,它也会显示整个编译行,这可能会帮助您理解为什么它如此之长。

您使用的是Jenkins / Hudson,那是错误发生的地方吗?

尝试以下方法:

  • 停用构建。
  • 登录您的构建服务器作为您的JENKINS用户,找到Jenkins / Hudson正在尝试构建的workdir目录。
  • 您可能需要更改$PATH或将$JAVA_HOME设置为指向Hudson / Jenkins正在使用的JDK。
  • 现在,像Jenkins / Hudson一样运行ant -d   <target> 。将此输出通过tee传输到文件中。现在,看看Hudson / Jenkins正在做什么以及为什么javac有太多的论点。

答案 2 :(得分:0)

build.xml中的apply使用fileset,例如

<?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)。