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

lrk*_*kwz 5 ant shell

我有一个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
Run Code Online (Sandbox Code Playgroud)

参数列表相当大,实际上包含了WEB-INF/lib231650个字符长的所有jar文件!任何建议如何解决?

ken*_*orb 0

用于applyfileset的 中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>
Run Code Online (Sandbox Code Playgroud)

默认情况下,该命令将为每个文件执行一次。

如果您需要使用parallel仅运行命令一次,则使用maxparallel通过一次最多传递这么多源文件来限制并行度(例如设置为1000每次运行传递一千个文件)。例如:

<apply executable="javac" parallel="true" maxparallel="1000" dir="${basedir}">
  <fileset refid="myfiles"/>
</apply>
Run Code Online (Sandbox Code Playgroud)

要查看总共有多少个文件,请检查缓存文件的内容(cache.cachefile在上面的示例中查找)。