我有一个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个字符!
有任何建议如何修复它?
答案 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,那是错误发生的地方吗?
尝试以下方法:
workdir
目录。$PATH
或将$JAVA_HOME
设置为指向Hudson / Jenkins正在使用的JDK。ant -d
<target>
。将此输出通过tee
传输到文件中。现在,看看Hudson / Jenkins正在做什么以及为什么javac
有太多的论点。答案 2 :(得分:0)
<?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
)。